Bagaimana cara membaca ribuan baris kode tanpa dokumentasi? [Tutup]

12

Sebelumnya saya sedang mencari kontrol TimeLine yang baik untuk proyek WPF. Saya menemukan jawaban di Sini yang mengarahkan saya ke proyek CodePlex ini .

Sekarang saya ingin mengubah kode untuk memenuhi kebutuhan budaya saya. Tetapi ada beberapa ketidakcocokan!

Pertanyaanku adalah:

Bagaimana Anda berinteraksi dengan ribuan baris kode?

EDIT:

Pintasan apa pun akan menjadi luar biasa!

Jalal
sumber
3
meminta kenaikan gaji. itu selalu membantu. (mereka dapat membuat motivator dari ini)
Nama Tampilan
2
membenturkan kepala ke meja sampai semuanya menjadi jelas.
Ubur
19
bagaimana kamu memakan se ekor gajah? ... Satu gigitan sekaligus.
Bill
1
@Jalal Itulah yang mereka ingin Anda pikirkan.
Mateen Ulhaq
2
@DisplayName, pendekatan wortel dan tongkat untuk motivasi telah terbukti menjadi solusi yang buruk untuk setiap pekerjaan yang membutuhkan keterampilan kognitif yang belum sempurna. Ilmu motivasi lebih kompleks daripada sistem imbalan. Lihat 'Drive: Kebenaran mengejutkan tentang apa yang memotivasi kami' oleh Dan Pink, itu adalah bacaan yang mencengangkan. Atau lihat video tabung Anda ini untuk versi kental. youtube.com/watch?v=u6XAPnuFjJc
Ryan Taylor

Jawaban:

37

Anda menambahkan komentar ke kode sumber ketika Anda sudah cukup memahaminya untuk dapat melakukannya. Refactor komentar ini dengan penuh semangat karena Anda semakin mengerti.

pengguna1249
sumber
3
+1 dan satu cara yang baik adalah dengan benar-benar menulis dokumentasi saat Anda menelusuri kode sumber. Dan mengapa mengirim kontribusi Anda kembali ke koordinator op?
1
+1 Juga, jika Anda memodifikasi kode, pastikan Anda juga mengubah komentar Anda, sehingga pengembangan masa depan tidak bingung dengan apa yang Anda lakukan. Malu untuk melakukan semua itu dan membuat orang membencinya karena itu salah!
Michael K
1
Jika proyek asli berada dalam sistem kontrol sumber terdistribusi (seperti git) itu akan bermanfaat untuk memotongnya, komit perubahan Anda secara bertahap dan melakukannya dengan cara sehingga Anda dapat menggabungkan perubahan Anda nanti dengan yang asli
8
  1. Langkah melalui kode
  2. Ganti nama sesuai kebutuhan
  3. Reaktor sesuai kebutuhan
  4. Ulangi sampai Anda benar-benar mengerti

... dan kodenya akan berterima kasih untuk itu. ;-)

John MacIntyre
sumber
7
Mengubah tempat acak dalam kode produksi hanya karena lebih mudah, bukan ide yang sangat bagus. Hanya permintaan fitur yang dapat menyebabkan modifikasi kode, anjak piutang adalah permintaan fitur. Tidak peduli seberapa baik Anda, istirahat kode, kadang-kadang efek samping bodoh adalah apa yang pelanggan andalkan. Hanya kode refactor yang sangat Anda yakini. Dan ingat, bahkan unit-test tidak menjamin apa pun.
Coder
Setuju, tetapi refactoring hanya untuk mencoba desain dapat membantu Anda memahami mengapa kode ditulis seperti itu (atau mengonfirmasi bahwa Anda benar bahwa itu dilakukan dengan buruk / aneh). Anda tidak harus menyimpan perubahan itu.
Ricky Clarkson
+1 Coder. Dan jawaban ini saat ini bahkan tidak menyebutkan tes unit. Mengerikan.
MarkJ
Maaf, bukan berarti refactoring besar. Sedang berbicara lebih banyak tentang refactoring minor, hal-hal jenis pembersihan. Jadi pada akhirnya, Anda sampai pada titik bahwa tujuan kode jelas.
John MacIntyre
5

Ambil satu tindakan, debug (berulang-ulang) kode untuk menemukan bagaimana tindakan itu dilakukan. Tuliskan hal yang sama dalam bahasa sederhana untuk mendapatkan pemahaman yang lebih baik!

Sri Kumar
sumber
Saya biasanya melakukan ini juga sampai saya menghadapi proyek yang tidak dapat berjalan dalam mode debug! Selalu macet saat start up! :( Tapi itu berjalan baik dalam Mode Rilis: S
Afriza N. Arief
@afriza APA APAAN INI. Itu beberapa kode yang sangat buruk, periksa kesalahan apa yang Anda berikan.
Daniel S
@afriza, hal pertama yang harus diperbaiki!
4

Sesuatu yang ditulis Joel Spolsky jauh ketika di blognya (tidak dapat menemukan artikel sekarang) benar-benar terjebak dengan saya mengenai hal ini:

Dia mengatakan bahwa kode bukan bahasa manusia alami, tetapi sebagai programmer, kita dengan mudah terbuai untuk berpikir bahwa itu adalah, dan bahwa kita harus dapat membacanya seperti itu. Akibatnya, banyak dari kita melihat kode baru dan berharap dapat "membacanya" dan memahaminya segera, seolah-olah itu adalah blok teks dalam bahasa Inggris.

Jadi saya pikir kuncinya adalah pada dasarnya hanya lambat, metodis, dan ilmiah. Dan seperti yang orang lain katakan - berkomentar (dan bahkan refactor) saat Anda pergi. Jangan jatuh ke dalam pola pikir "Saya hanya harus melihatnya dan segera mengerti".

Oh, dan ya, kadang-kadang saya masih jatuh ke dalam perangkap ini. "Lakukan apa yang aku katakan, bukan seperti yang aku lakukan", dan semua itu. :)

Tabel Bobby
sumber
Faktanya adalah, teks bahasa Inggris yang dapat Anda "baca" biasanya linear, alasan mengapa kode sering sulit dicerna pada awalnya umumnya karena non-linear dan triknya hanya memecahnya. Banyaknya idiom implementasi berbeda yang digunakan pengembang umumnya juga tidak membantu, tetapi tahap pertama biasanya menjalankan kode melalui debugger, dan menggunakan breakpoint untuk melihat apa. Mencoba untuk hanya membacanya adalah latihan yang tidak ada gunanya. Serius, kapan terakhir kali Anda membaca kode yang Anda tulis? (mulai dari akhir.)
ocodo
Sebenarnya, kode yang ditulis dengan baik mudah dibaca, tetapi tidak sebagai teks. Anda cukup memindai untuk melihat blok bangunan dan memahami struktur inti, tidak perlu membaca semuanya. Pendekatan pengkodean yang buruk, seperti kode skool lama, atau penyalahgunaan SOLID dan pola dapat membuat tugas ini sangat sulit.
Coder
4

SE-Radio mewawancarai Dave Thomas tentang hal ini

Episode podcast ini memiliki banyak tips dan teknik untuk memasuki 'budaya' proyek dan memahami bagaimana penduduk asli hidup.

Michael Easter
sumber
Bagian lucu tentang pengalaman Dave Thomas adalah bahwa dokumentasi - di luar tinjauan tingkat tinggi - hampir tanpa kecuali lebih buruk daripada tidak ada dokumentasi sama sekali. (Menurut pengalaman saya, itu karena sebagian besar dokumentasi adalah boilerplate yang memberikan pemahaman di permukaan tentang “apa” atau “bagaimana,” yang kemudian dibiarkan ketinggalan zaman, sampai menyesatkan.)
Michael Kropat
2

Saya harus melakukan ini baru-baru ini dengan proyek lebih dari 100.000 LOC. Ide pertama saya adalah bahwa lebih mudah untuk melihat pola dari grafik 100 atau bahkan 1000 node daripada dari 100.000 baris teks.

Jadi saya menghabiskan 45 menit dan menulis program Python pendek (<100LOC) untuk menguraikan apa yang saya butuhkan darinya, dan menggambar hubungan objek. Saya menghasilkan sumber Graphviz , yang merupakan bahasa yang sangat mudah untuk dihasilkan. (Tidak ada yang istimewa tentang Python di sini: Ruby atau C # atau Common Lisp atau apa pun yang bisa melakukannya dengan baik.)

Pada proyek lain, saya telah melihat orang menggunakan Graphviz untuk dependensi modul, grafik panggilan, riwayat versi, semua hal. Meta-tool visualisasi program terbaik.

(Mungkin itu karena saya mengambil kompiler , tapi saya merasa aneh bahwa ketika seorang programmer dihadapkan dengan masalah, jawabannya sepertinya selalu "menulis program!", Kecuali ketika masalahnya melibatkan kode sumber ke suatu program.: - )

pengguna18893
sumber
1

Melangkahinya di debugger saat berjalan, itu satu-satunya cara untuk memahami basis kode baru yang besar.

grrussel
sumber
2
Itu bukan pilihan praktis ketika Anda memiliki ribuan baris kode (khususnya ketika kita berbicara tentang puluhan atau ratusan KLOC), dan / atau jika bagian dari kode itu ada di templat. Untuk memahami basis kode baru (dan tidak didokumentasikan dengan baik), kita juga harus melibatkan bisnis dan mencoba memahami konteks di mana kode seharusnya dijalankan. Jika Anda bisa membaca kode dengan debugger dan memahaminya, basis kode itu tidak terlalu besar untuk memulai (membuat penggunaan debugger agak tidak perlu dalam kebanyakan kasus.)
luis.espinal
Celakalah jika basis kode terlalu besar untuk di-debug dalam debugger. Melihat kode bereaksi terhadap input dan output yang dikenal membantu mengubah pengetahuan "apa" menjadi "bagaimana". Pertanyaan "mengapa" tidak pernah dijawab dengan debugger saja, tetapi mungkin ada komentar sumber inline yang dapat Anda lihat di IDE saat Anda debug.
grrussel
@ Grrussel Saya harus tidak setuju karena ini bukan apa yang saya lakukan ... Saya tidak tahu apakah saya representatif atau tidak! Saya bisa melihat menggunakan breakpoint aneh (tapi masih belum secara eksplisit melangkah melalui) dan saya menggunakan fitur IDE untuk memungkinkan saya untuk menghubungkan satu bagian dengan yang lain.
Murph
1

Pahami bahwa benar-benar tidak ada jalan pintas untuk mencari sesuatu dengan penuh. (Dan jika Anda memiliki masalah dengan kalimat itu, pendidikan Anda telah diabaikan. Ini berasal dari "Stranger In a Strange Land", oleh Robert A. Heinlein.)

Bacalah, satu halaman setiap kali, satu rutin setiap kali. Tambahkan komentar. Buat gambar struktur data utama. Kenali algoritme. Dapatkan pengetahuan sebelumnya.

Tahan godaan untuk menghidupkan debugger. Area pandang debugger terlalu kecil: Anda melihat satu baris pada satu waktu, tetapi Anda benar-benar tidak melihat ke mana saja Anda pergi atau ke mana Anda pergi.

John R. Strohm
sumber
Debugger menjelaskan beberapa konvensi konvensi penulis kode asli tentang apa yang diharapkan di dalam variabel (misalnya apakah mereka mengharapkan Full-Path atau nama file atau path relatif?) Dan banyak hal lain sehingga masih penting menurut pendapat saya
Afriza N. Arief
2
-1 untuk berpikir bahwa Anda keren karena Anda menggunakan kata "grok"
Carson63000
1

Apa pun yang Anda lakukan, tuliskan sebanyak mungkin yang Anda bisa, jadi tidak ada yang berakhir di posisi yang sama dengan Anda.

Jon Hopkins
sumber
1

Anda perlu menggunakan petunjuk. dapatkan petunjuk tentang apa yang harus Anda cari dan gunakan fungsionalitas pencarian lingkungan atau IDE Anda secara luas yang dapat membawa Anda ke bagian kode yang diinginkan yang ingin Anda ubah.

membaca 14 ribu baris kode java tidak masuk akal. Fungsionalitas pencarian adalah penyelamat hidup Anda

pengguna18883
sumber
0

Orang yang berbeda memiliki gaya belajar yang berbeda, demikian YMMV. Hal pertama yang saya lakukan dalam situasi ini adalah membaca seluruh basis kode setidaknya sekali. Itu memberi saya ide umum di mana semuanya berada. Lalu saya memilih bagian untuk memeriksa lebih detail. Struktur data akan menjadi tempat yang baik untuk memulai. Setelah saya memiliki ide umum tentang apa yang terjadi, saya melakukan hal yang sama dengan bagian lain dari kode yang berinteraksi dengan yang pertama. Setelah iterasi yang cukup, saya memiliki perasaan yang baik tentang bagaimana kode bekerja.

Larry Coleman
sumber
0

Cara terbaik, karena dengan semua pemrograman tidak hanya potongan besar kode uncommented, adalah memecahnya menjadi beberapa bagian. Ini adalah sesuatu yang harus Anda lakukan di kepala Anda serta secara visual dalam kode. Ini mungkin berarti menambahkan komentar tebal atau banyak jeda baris. Ini membantu sambil menggulirnya untuk melihat bagian-bagiannya. Cobalah untuk menemukan potongan kode logis.

Tentu saja, ketika Anda mengerti sedikit, komentari mereka untuk apa yang Anda tahu pada waktu itu, mungkin mencatat tentang sesuatu yang Anda tidak mengerti.

Saya juga merekomendasikan untuk tidak mencoba memahami seluruh bagian sejak awal. Alih-alih mencoba memahami bagian yang perlu Anda ketahui saat ini dan mengerjakan sisanya nanti.

Darryl Hein
sumber
0

Saya akan mulai dengan menggunakan Leo Editor dalam mode @shadow dengan menggunakan node kloning secara aktif . Ini memungkinkan seseorang untuk menambahkan catatan dan komentar untuk setiap bagian kode yang sedang dipelajari tanpa mengubah kode , dan anotasi akan selalu dalam konteks, di samping kode yang dibicarakannya. Berikut ini contoh alur kerja dokumen:

Misalnya, ketika saya memperbaiki bug di Leo, saya membuat simpul biasa untuk mewakili bug. Node bug ini adalah pandangan saya tentang semua data dalam kode sumber Leo yang berhubungan dengan bug. Ketika saya menemukan kode yang terkait dengan bug, saya mengkloning node mereka dan memindahkannya di bawah bug bug. Saya juga akan menambahkan node biasa sebagai anak-anak dari node bug. Node-node ini berisi laporan bug asli, deskripsi bagaimana saya memperbaiki bug, data pengujian, atau catatan lain yang mungkin ingin saya simpan.

Setelah saya membuat simpul bug, saya hanya berkonsentrasi pada simpul itu dan anak-anaknya. Saya dapat memeriksa node bug dan anak-anaknya tanpa harus melompat keluar garis besar. Semua yang saya butuhkan ada di satu tempat. Ketika saya benar-benar memperbaiki bug saya bisa melakukannya dengan mengubah klon. Sekali lagi, saya tidak harus melompati garis besar. Tidak masalah seberapa besar atau kompleks keseluruhan garis besarnya: Saya hanya berurusan dengan simpul bug dan anak-anaknya. Fokus yang sangat sempit ini membuatnya lebih mudah untuk memperbaiki bug.

matt wilkie
sumber
0

Gambar diagram sumber: hubungan data, hubungan fungsional, hubungan objek. Tentukan agregasi, aliran data, dan aliran kode. Gambar jauh lebih baik daripada komentar untuk ini, dan dapat dipisahkan dari kode.

Bruce Alderson
sumber
0

Sebelum Anda refactor apa pun menulis tes. Banyak tes. Tes yang sangat spesifik untuk blok kecil kode yang setidaknya dapat dipanggil, karena akan tergantung pada bagaimana kekacauan yang Anda warisi ditulis.

Keuntungan dari menulis tes untuk memulai adalah bahwa Anda harus memiliki semacam pemahaman kode sebelum Anda bisa mengujinya, sehingga setiap tes yang Anda tulis semoga akan sedikit pengetahuan yang diperoleh. Anda juga dapat sangat mengomentari tes dengan asumsi Anda di samping asersi.

Dengan melakukan tes terlebih dahulu, Anda tidak berisiko mengubah sesuatu dalam kode yang memiliki efek knock-on yang tidak dapat Anda ketahui. Anda juga akan memiliki jaring pengaman ketika Anda datang untuk memperbaiki kode.

chooban
sumber
0

Saya menggunakan alat seperti doxygen, untuk menghasilkan diagram kelas secara keseluruhan, daripada menambahkan pemahaman saya tentang apa yang dilakukan masing-masing kelas.

Lalu saya mengambil beberapa bug mudah dari antrian bug (sebelum manajer saya memberikan bug yang sulit kepada saya: P), kemudian jalankan melalui fungsi itu ke debugger dan mencoba untuk menghasilkan aliran data kasar atau model aliran kode.

Misalnya fungsi ekspor di beberapa perangkat lunak: jadi saya mencoba memahami bagaimana sumber data dibaca, dari mana dalam kode (antarmuka dasar) saya dapat mengevaluasi data yang dibaca dengan benar menggunakan kelas saya dan diagram alir kode, kelas mana yang bertanggung jawab untuk jenis ekspor, dll. Saya pikir setengah dari pemahaman dilakukan, setelah Anda memiliki diagram kelas dan diagram alir.

Priyank Bolia
sumber
0

Dekati cacat sepele, misalnya NullPointerException. Hindari segala sesuatu tentang konkurensi pada awalnya, apa pun yang pada dasarnya akan melibatkan pemahaman banyak kode sekaligus.

Setelah Anda memperbaiki beberapa bug, Anda mungkin akan memiliki ide yang cukup bagus. Bagaimanapun juga, ini bekerja untuk saya.

Ricky Clarkson
sumber
-2

Pada dasarnya tindakan untuk menulis kode bersih harus dimulai langsung dari desain. Jika kami membuat kode dalam bahasa OOP, buatlah UML, bagikan dengan rekan-rekan dan yakinlah bahwa desain tidak ambigu. Bagaimanapun kami pengembang harus yakin bahwa desain menyelesaikan masalah dan bukan ambiguo.

Ketika datang ke pengkodean kita harus memastikan desain dikonversi menjadi kode yaitu Entitas ke kelas atau struct, operasi untuk berfungsi dll.

Dan saya membaca kertas putih http://queue.acm.org/detail.cfm?id=2063168 yang membahas tentang gaya pengkodean atau bagaimana kita dapat menggunakan ruang, lekukan, variasi font karena kebanyakan IDE dapat kita gunakan untuk menulis BANYAK Kode CLEANER di mana kita manusia dapat memahami sebanyak mesin lakukan. Ini lebih menekankan pada penulisan kode bebas komentar sehingga kode kita akan muncul sebagai paragraf itu sendiri.

Vasanth
sumber