Haruskah kita mencari kode kebohongan?

9

Ini merujuk pada diskusi dalam jawaban dan komentar dari pertanyaan ini: Ada apa dengan keengganan dokumentasi di industri? . Jawabannya mengklaim bahwa "kode tidak bisa berbohong" dan karenanya harus menjadi lokasi masuk bukan dokumentasi. Beberapa komentar menunjukkan bahwa "kode bisa berbohong". Ada kebenaran di kedua sisi, setidaknya sebagian karena betapa buruk dan tidak tepat dokumentasi ditangani.

Haruskah kita mencari kode kebohongan, membandingkannya dengan dokumentasi yang ada? Atau biasanya itu sumber terbaik untuk apa yang perlu dilakukan? Jika itu adalah kode yang gesit, apakah ia cenderung berbohong, atau bisakah kode itu tidak berbohong sama sekali?

thursdaysgeek
sumber
1
Bisakah Anda menjelaskan apa yang Anda maksud dengan "kebohongan"? Kami tidak perlu merujuk komentar di pertanyaan lain untuk mendapatkan konteks Anda.
user16764
@ user16764 Tanpa melihat utas lainnya, hal pertama yang harus diingat adalah Kontes C
Tertutup
Jika dokumentasi mengatakan bahwa kode harus melakukan foo, dan kode melakukan bar, apakah itu berarti bahwa bar adalah apa yang seharusnya dilakukan oleh kode? Atau apakah kita menganggap bar adalah tindakan yang benar karena kita tidak pernah membaca dokumentasi, karena kode selalu benar?
thursdaysgeek
Jika kode telah diterima sebagai bilah, maka dokumentasi salah dan ketinggalan jaman. Tetapi jika foo dan bar terkait erat, dan pengguna belum memperhatikan bahwa itu tidak cukup menyelesaikan masalah mereka seperti yang mereka harapkan, maka mungkin dokumentasi tentang foo tidak salah? Dengan kata lain, apakah kode benar - benar menjadi semua dan mengakhiri semua yang seharusnya dilakukan oleh kode?
thursdaysgeek

Jawaban:

9

Dalam kata-kata awam:

Ya , Anda harus mencari kode berbohong dan membuatnya mengatakan yang sebenarnya. Tetapi tidak dengan membandingkannya dengan dokumentasi. Itu akan menjadi metode untuk mendeteksi dokumentasi yang berbohong.

Ada beberapa cara kode bisa berbohong, yang akan saya sebutkan hanya beberapa:

  • Blok kode yang tidak pernah dijalankan karena kondisi yang tidak pernah dipenuhi. Kode ini membohongi Anda tentang berapa banyak.
  • Kode yang menambah kompleksitas yang tidak perlu terletak pada seberapa rumit masalah sebenarnya.
  • Kode tanpa konvensi penamaan terletak karena itu menyesatkan Anda untuk berpikir itu melakukan sesuatu yang berbeda dengan apa yang sebenarnya dilakukannya.

Semakin pendek, semakin sedikit kebohongannya. Sudah terbukti dengan sendirinya.

Semakin tidak rumit kodenya, semakin transparan. Jadi letaknya lebih sedikit.

Trik sintaksis berbohong banyak. Pilih algoritma langkah-demi-langkah yang lebih jelas. Mereka kurang berbohong.

Alat analisis kode statis yang baik dapat membantu Anda menemukan kode yang terletak.

Baterai tes otomatis yang baik memaksa kode untuk mengatakan yang sebenarnya.

Tulains Córdova
sumber
4
The shorter and terser the code is, the less it lies. It's self evident. Saya sulit mengatakannya. Dalam pengalaman saya, semakin pendek dan semakin mudah kode, semakin banyak peluang yang harus disapu terletak di bawah permadani, umumnya dengan menyembunyikan mereka dalam panggilan fungsi menipu.
Mason Wheeler
@MasonWheeler Anda benar. Saya mengedit bagian "singkat".
Tulains Córdova
Saya tidak yakin dengan "Kode tanpa kebohongan penamaan". Ini memang buruk, tetapi bagaimana bisa berbohong jika tidak memberi tahu Anda apa-apa? "Aku tidak memberitahumu!" keras kepala obstruktif dan tidak informatif tetapi tidak menipu. Tentunya "kebohongan" adalah ketika konvensi penamaan ada, tetapi digunakan dengan cara yang tidak sesuai dengan kode sebenarnya - misalnya jika Anda menggunakan bahasa Hungaria (yuck!) Tetapi kadang-kadang memiliki awalan puntuk variabel yang bukan pointer.
Steve314
2
Sebenarnya, apa yang Anda sarankan mungkin lebih baik digambarkan sebagai "menyesatkan" daripada hanya sebagai "kebohongan". Sophistry cenderung bertele-tele dan rumit sehingga sulit untuk melihat kelemahan logisnya, dan secara superfisial cerdas dan percaya diri sehingga orang takut mempertanyakannya jika mereka terlihat bodoh.
Steve314
Contoh lain: Kode yang mengubah bahasa yang mendasari atau properti runtime, misalnya mendefinisikan ulang atau menutupi perilaku primitif.
JustinC
6

Kode tidak bisa bohong.

Apa yang ada dalam kode adalah apa yang sedang dilakukan program Anda - tidak peduli apa dokumentasi, QA, atau kata pelanggan. Terutama jika kode Anda telah dirilis dan berada di lapangan untuk sementara waktu, perilaku yang diharapkan tidak boleh diabaikan.

Kode itu tentu saja bisa salah . Tentu saja bisa menyesatkan dalam penamaan atau organisasinya. Ini tentu saja tidak bisa dibaca.

Tetapi jika Anda ingin sumber kebenaran untuk apa kode Anda lakukan , bukan apa yang seharusnya dilakukan, bukan apa yang dirancang untuk dilakukan, bukan apa yang Anda pikir itu lakukan ... jika Anda perlu tahu apa yang sebenarnya dilakukan, buka kode.

Telastyn
sumber
Ada mazhab pemikiran bahwa jika Anda sengaja menipu tetapi secara benar benar, maka Anda tidak bohong. Itu bukan satu-satunya aliran pemikiran. Sebagai contoh, saya memiliki edisi lama Detecting Lies and Deceit oleh Aldert Vrij . Salah satu hal pertama yang dilakukan adalah mempertimbangkan berbagai definisi dusta dan penipuan, memilih untuk memasukkan pernyataan yang secara pedantik benar-tetapi-sengaja-menyesatkan sebagian karena itu adalah pemahaman yang sama pula.
Steve314
Maaf, tetapi mengatakan "tapi itu sangat benar" tidak berarti Anda tidak bisa disebut pembohong - bahkan jika orang tidak membantah, mereka masih mengetahuinya.
Steve314
@ steve314 - pssh. Pertanyaan aslinya ada di sekitar komentar. Membangun orang bodoh untuk skenario langka ini di mana kode diberi nama yang menyesatkan untuk membantah komentar (dan mengabaikan skenario komentar yang sudah ketinggalan zaman) tidak masuk akal.
Telastyn
1
Saya setuju dengan itu - saya tidak berdebat tentang poin yang Anda buat, hanya definisi yang jelas tentang "kebohongan" yang Anda gunakan saat melakukannya. Kode bisa berbohong - bukan ke kompiler, tetapi tentu saja untuk pembaca manusia. Ini bahkan merupakan tujuan yang disengaja dalam beberapa kasus - hal-hal seperti kontes C yang dikaburkan akan menjadi contoh yang relatif jinak. Sophistry, seperti yang saya sarankan dalam komentar saya ke user61852. Hanya karena kompiler melihat kebohongan tidak berarti itu bukan kebohongan.
Steve314
@ Telastyn Saya kira Anda tidak pernah memiliki filter melakukan redirect menyebabkan langkah-benar terjadi di whitespace dan kemudian masuk ke kode yang tidak dipanggil dari metode itu, tidak pernah kembali, kan? Ya Tuhan, aku benci! @ # $ Java devs lakukan dengan Java.
Erik Reppen
0

Anda mengajukan beberapa pertanyaan.

Haruskah kita mencari kode kebohongan?

Tentu saja!

Haruskah kita membandingkan [kode] dengan dokumentasi yang ada?

Itu tidak akan pernah menyakiti, meskipun seperti yang disebutkan dalam jawaban lain, lebih sering daripada tidak ini akan menyebabkan Anda menemukan masalah dalam dokumentasi , bukan dalam kode .

Atau apakah [kode] biasanya sumber terbaik untuk apa yang perlu dilakukan?

Itu selalu merupakan sumber terbaik untuk apa yang dilakukannya. Sumber terbaik untuk kode apa yang harus dilakukan dapat (kombinasi dari) hal-hal yang berbeda, yang utama adalah:

  • Kode itu sendiri;
  • Kode panggilan;
  • Komentar dalam kode itu;
  • Dokumentasi;
  • Tes unit;
  • Tes integrasi dan regresi;
  • Programmer;
  • Pengguna akhir;

Sumber mana yang "terbaik" (atau kombinasinya) tergantung pada situasi Anda.

Jika itu adalah kode yang gesit, apakah ia cenderung berbohong, atau bisakah kode itu tidak berbohong sama sekali?

Saya tidak yakin apa yang Anda maksud dengan "kode gesit", AFAIK "gesit" biasanya mengacu pada proses pengkodean. Misalkan Anda berarti "kode yang dibuat dalam proses pemrograman tangkas" maka saya pikir aman untuk mengatakan bahwa itu masih bisa berbohong. Betapa mungkin berbohong, dibandingkan dengan kode yang dibuat dalam proyek-proyek gaya air terjun misalnya adalah masalah subyektif (secara pribadi saya tidak berpikir ada koneksi besar).


Catatan Kaki
Semua hal di atas adalah dengan asumsi bahwa kode dapat berbohong, dan bahwa ini adalah contoh dasar (walaupun sedikit dibuat-buat):

public int DivideByTwo(int input) 
{
    return input / 3;
}

Ini hanyalah salah satu contoh di mana saya akan mengatakan "kebohongan kode", @ user61852 memiliki beberapa yang lain (kode tidak terjangkau, kompleksitas kode tidak cocok dengan kompleksitas masalah, penamaan yang buruk), dan saya pikir masih banyak lagi. Wikipedia memiliki ringkasan kebohongan yang lumayan , banyak dari mereka dapat ditemukan kode.

Perhatikan bahwa jika Anda bertengkar dengan seseorang, pastikan orang lain tidak bermaksud dengan "kode tidak bisa berbohong" bahwa "kode melakukan apa yang dilakukannya". Pada dasarnya orang lain di sini mendefinisikan menggunakan definisi untuk "berbohong" yang sangat sempit sehingga dapat menyatakan pernyataan "kode tidak bisa berbohong" sebagai axioma / kebenaran dasar. Dalam hal ini mungkin yang terbaik adalah setuju dengan axioma-nya.

Jeroen
sumber
0
if (x > 5) {
  doSomething();
} else {
  doADifferentThing();
}

Anda dapat berdebat tentang apakah kata "kebohongan" secara teknis sesuai, tetapi kode ini menyiratkan cukup jelas bahwa x kadang - kadang akan lebih besar dari 5 dan kadang-kadang tidak. Jika Anda melihat program lengkap dan menemukan bahwa fungsi ini hanya pernah dipanggil di satu tempat, dan bahwa x selalu diset ke konstanta 6, maka itu bohong.

Selain itu, kompiler mungkin telah memperhatikan hal ini, dan mengganti blok kode ini dengan sederhana

doSomething()

Jika doADifferentThing tidak dipanggil di tempat lain di program Anda, itu dapat dihapus dari program sepenuhnya.

Jika bahasa Anda mendukung assertsejenis, yang dimatikan dalam pembuatan produksi, setiap assertpernyataan berpotensi bohong. Typecast adalah pernyataan lain yang bisa jadi bohong.

MatrixFrog
sumber