Bagaimana orang bisa menulis dan memelihara kode yang sangat rumit dan sulit dibaca? [Tutup]

27

Membaca kode sumber SQLite adalah misi IMO tidak mungkin. Namun itu adalah bagian dari perangkat lunak yang cukup dapat digunakan (ini adalah database tertanam yang lengkap) yang dapat diunduh, dikompilasi dan digunakan dari kode orang lain dan terus diperbarui.

Bagaimana orang bisa menulis dan memelihara kode yang begitu rumit dan sulit dibaca?

sharptooth
sumber
1
Saya pikir, mereka tidak :-D
Pawka
2
@ Pawka: Di mana "mereka" tidak termasuk orang SQLite.
Frank Shearar
11
Sekalipun kodenya rumit dan sulit dibaca, mungkin kodenya relatif bagus mengingat kompleksitas masalah yang dipecahkannya. Menulis kode sederhana dan mudah yang menyelesaikan masalah sulit seringkali tidak mungkin, tidak peduli seberapa dekat Anda mengikuti "praktik terbaik". Maka lebih penting lagi untuk membuat kode sesederhana dan sejelas mungkin .
Joonas Pulakka
1
Adakah yang pernah melihat proyek besar yang mudah dibaca?
Jeff Davis
2
Menyewa magang, postdoc, dll dan membuat mereka melakukannya ...
DarenW

Jawaban:

19

Ada perbedaan besar antara Complex dan Complicated. Tautan berikut tentang ringkasannya. :)

http://codebetter.com/blogs/dru.sellers/archive/2009/09/25/complex-vs-complicated.aspx

Pada catatan yang lebih pribadi, saya mengerjakan basis kode lebih dari 1 juta baris kode. Saya sudah di dalamnya dari baris 1 ke kondisi saat ini. Semakin Anda bertani (baca lagi kode Anda) semakin mudah. Saya tidak dapat memberi tahu Anda apa yang dilakukan setiap baris, tetapi saya dapat memberitahu Anda untuk mulai mencari tugas atau bug yang diberikan. Itu hanya datang secara alami.

Moral dari cerita ini adalah bahwa seperti hal-hal lain di dunia pemrograman, itu membutuhkan waktu. Jika Anda berharap untuk melihat SQLite dan hanya tahu dan memahaminya, Anda bercanda. Perlu waktu untuk memikirkan bagaimana semuanya bekerja bersama. Perbedaan antara kode yang baik dan kode yang buruk adalah berapa lama proses itu berlangsung.

Terakhir, beberapa pengembang tidak memiliki kemampuan untuk melompat ke basis kode dan mulai mencari tahu. Banyak yang akan merasa kewalahan dengan ukuran atau arsitektur basis kode. Yang lain tidak akan memiliki masalah hanya dengan melompat ke dalamnya. Itu semua tergantung pada kekuatan pengembang.

Tony
sumber
31

Dalam kasus spesifik SQLite, alat utama yang mereka pilih untuk digunakan dalam pengembangan dan pemeliharaan adalah pengujian otomatis. Mereka bangga akan cakupan 100% (cakupan cabang, bukan cakupan pernyataan) di ruang uji mereka. Menurut mereka, itu adalah salah satu produk perangkat lunak yang paling teruji di dunia. Jadi mereka langsung tahu ketika sesuatu yang mereka tambahkan atau ubah menyebabkan kemunduran, dan dapat berkembang tanpa rasa takut sebagai akibatnya.

http://sqlite.org/testing.html

Angka yang cukup mengejutkan - mereka memiliki sekitar 640 kali lebih banyak baris kode pengujian daripada kode produksi.

EDIT: Tampaknya pertanyaan ini telah dibangkitkan dari kematian! Dan sedikit lebih dari setahun kemudian, halaman yang sama melaporkan bahwa mereka memiliki 1177 kali lebih banyak baris kode pengujian dibandingkan dengan produksi!

Dan Ray
sumber
2
Tidak ada orang lain selain saya yang memandang ini sebagai masalah dan bukannya suatu kebanggaan ?
Stephen
1
saya kira tidak. Pertama-tama, basis data harus andal.
ts01
5
@Stephen, mengapa banyak kasus uji menjadi masalah ?
1
pinggang waktu? terlalu banyak tes sama buruknya dengan tes kecil (IMHO)
Dainius
9
Bagaimana tes dapat menjadi buang-buang waktu jika mencakup kemungkinan kasus di mana kode bisa gagal?
Ramhound
7
  • fungsionalitas berkembang seiring waktu.
    • fungsi baru didorong oleh kebutuhan pelanggan baru.
    • Kode lama ditulis dengan cara yang memungkinkan fungsi di masa depan yang belum diimplementasikan ditambahkan tanpa melanggar kode lama.
  • pakar domain (dalam hal ini, basis data adalah domain terkenal dalam Ilmu Komputer.)
  • umpan balik komunitas
    • bug
  • Kurva belajar yang curam bukanlah masalah bagi yang dipersiapkan dengan baik dan gigih. Mungkin perlu 6 bulan, 1 tahun atau bahkan lebih lama untuk merasa nyaman, dan itulah yang dapat dilakukan oleh beberapa orang.
  • motivasi komersial. tanpa dukungan moneter, sangat sedikit orang yang dapat menginvestasikan waktu dan energi ke dalam kurva pembelajaran yang curam.
rwong
sumber
4

Anda tidak perlu memiliki pemahaman yang mendalam tentang keseluruhan proyek untuk dapat mempertahankannya. Biasanya dengan perangkat lunak besar dan kompleks, orang akan memiliki "area" khusus mereka sendiri yang mereka rawat dan mereka hanya memiliki pengetahuan 'lewat' dari seluruh sistem.

SQLite sebenarnya relatif kecil pada skala "proyek perangkat lunak besar" tetapi jika Anda melihat sesuatu seperti sistem operasi Windows, Anda akan memiliki orang-orang yang hanya bekerja pada kernel, orang-orang yang hanya bekerja pada shell, orang-orang yang hanya bekerja di Internet Explorer, orang-orang yang hanya bekerja di Window manager, dll. Seseorang yang bekerja di "shell" tidak akan dapat memperbaiki bug di kernel dengan cepat.

Ada juga manfaat yang berkembang dari proyek-proyek ini dari waktu ke waktu: mereka tidak selalu memulai yang rumit ini. Itu berarti pengembang baru biasanya dapat "dilatih" oleh pengembang yang lebih berpengalaman.

Ketika Anda bergabung dengan tim besar pengembang, Anda akan diberikan aspek tertentu dari proyek untuk dikerjakan (mungkin bug atau fitur baru) dan Anda akan memiliki pengembang lain menjadi Anda "teman" untuk beberapa iterasi pertama. Teman Anda akan memiliki pemahaman yang baik tentang area Anda bekerja dan dapat membantu Anda menemukan jalan keluar.

Untuk proyek open source seperti SQLite, sebenarnya sedikit lebih sulit karena tidak ada motivasi bagi pengembang yang ada untuk "melatih" pengembang baru. Jadi Anda akan menemukan diri Anda sedikit lebih banyak. Tetapi Anda masih dapat menemukan bantuan di forum pengembang atau milis (mis. Hanya memposting pertanyaan seperti "Saya ingin menerapkan fitur ini & itu" atau "Saya menemukan bug XYZ, di mana saya mulai mencari?" Dan Anda cenderung mendapatkan beberapa bentuk bantuan.

Dean Harding
sumber
Ubah spesifik, dan ini sangat mirip dengan pekerjaan saya saat ini! Bagian terbaik dari jawaban ini adalah spesialisasi dan kebutuhan untuk berkembang seiring waktu. Tambahkan juga sedikit humor tentang semuanya.
DarenW
4

Ada perbedaan antara proyek yang sulit dibaca dan kompleks. Jika seseorang tidak memahami secara mendalam bahasa yang ditulis oleh proyek atau domain proyek, itu tidak berarti kode tersebut ditulis dengan buruk.

Saranku:

  • Pastikan Anda memahami bahasa proyek. Tidak cukup tahu bahasanya.
  • Pelajari setiap detail tentang domain sebelum memberikan kode.

Bagi saya SQLite jauh dari rumit dan tidak ada yang rumit. Domain proyek ini menuntut pemahaman mendalam tentang konsep luas.

Maniero
sumber
3

Satu hal yang tidak disebutkan dalam jawaban lain adalah "Itu datang secara alami kepada mereka". Kebanyakan orang ingin menulis kode yang baik tetapi mereka disetel untuk menulis kode yang buruk. Beberapa programmer yang saya temui adalah pemikir LINEAR alami + beberapa kali dengan sangat sadar mereka datang dengan solusi yang kompleks. Kebanyakan orang seperti itu tidak menghabiskan waktu membaca atau belajar dari buku yang mereka pelajari ketika dan ketika pekerjaan menuntutnya.

Kutu buku
sumber
1
LOL, saya bekerja dengan soemone seperti ini, jika ada beberapa cara untuk melakukan sesuatu (dan selalu ada) ia akan selalu memilih solusi yang paling rumit dan berbelit-belit. Saya pikir dia bahkan tidak menyadarinya.
HLGEM
3

Bagaimana orang bisa menulis dan memelihara kode yang begitu rumit dan sulit dibaca?

Jika mereka adalah coders asli, dan mereka tetap mempertahankannya, mereka tidak melihatnya sebagai "rumit dan sulit dibaca". Mereka mungkin melihatnya sebagai "sederhana dan mudah dibaca", karena mereka menulisnya sendiri.

Kode apa pun membutuhkan waktu untuk memahaminya. Hanya saja beberapa memakan waktu lebih lama dari yang lain :)

lamcro
sumber
2

Anda dapat membungkus kepala Anda di sekitar basis kode apa pun jika Anda memiliki - ketekunan, kesabaran dan pendekatan metodis - tetapi terutama ketekunan :-)

Nikhil
sumber
1

Mengelola menjadi jauh lebih mudah jika ada hal yang dilakukan selalu dengan cara yang sama. Saya tidak tahu kode SQLite, tapi saya bekerja di lingkungan di mana ada beberapa proyek. Selain memahami kasus bisnis (persamaan logika), karena semuanya pada dasarnya dilakukan dengan cara yang sama di mana-mana (akses database, dll.) Relatif mudah untuk mulai bekerja pada proyek lain. Teks panjang pendek: Pedoman pengkodean - dengan cara yang tepat - membuat hidup dan kode semacam itu jauh lebih mudah. Ini bisa menjadi salah satu pembantu untuk coders SQLite.

Sascha
sumber
1
  • Jika Anda adalah pembuat asli perangkat lunak, dan Anda telah bekerja dengannya selama> 10 tahun, dan Anda seorang jenius, maka mungkin untuk memahami semuanya. Potongan besar perangkat lunak yang kompleks (seperti SQLite atau kernel Linux) memang biasanya memiliki satu penulis asli yang memiliki pemahaman yang mendalam dan mendalam tentang hal itu, bahkan jika orang lain telah berkontribusi.
  • Jika arsitektur perangkat lunaknya waras (kohesi tinggi, kopling rendah), memahami semuanya bukanlah prasyarat untuk membuat penambahan dan modifikasi yang bermanfaat.
  • Memahami RDBMS atau OS adalah kasus yang agak khusus, membutuhkan pemahaman mendalam tentang prinsip-prinsip CS yang mendasarinya. Tidak demikian halnya dengan aplikasi perangkat lunak "biasa".
Joonas Pulakka
sumber
1

Mereka mencoba menulisnya dengan cara yang sederhana tetapi tidak dengan cara yang sederhana.

Menjadi sesederhana mungkin membuat hal-hal lebih cepat dipahami / dibaca, bahkan jika itu membutuhkan waktu.

Klaim
sumber
1

Algoritme yang diimplementasikan menetapkan batas yang lebih rendah pada seberapa sederhananya kode untuk suatu implementasi. Jika deskripsi abstrak dari algoritma yang akan diimplementasikan sangat rumit dan membutuhkan banyak potongan data yang berbeda untuk digabungkan satu sama lain, maka kode yang mengimplementasikan algoritma tersebut tidak dapat sederhana tidak peduli siapa yang menulisnya.

Dengan kata lain, salah satu alasan mengapa saya terkadang menulis kode yang tidak dapat dipahami adalah karena, mengingat algoritma yang ingin saya terapkan, saya tidak punya pilihan.

dsimcha
sumber