Apakah tujuan di balik kode menjadi 'idiomatik' untuk mengurangi overhead kognitif?

22

Saya mencoba menjelaskan kepada seseorang bahwa cara mereka menulis kode membuatnya sulit dimengerti, dan jika Anda refactor maka lebih mudah dibaca. Gaya kode yang saya kendarai ini umumnya disebut kode 'idiomatik'.

Tetapi frasa kode idiomatik membawa serta bagasi kebenaran moral , yang bukan motivator yang bagus untuk membuat orang mengubah gaya pengkodean mereka. Cara yang lebih positif untuk mengatakan ini adalah kode yang mengikuti gaya umum - tetapi bagi seorang pemikir kritis yang tampil sebagai alasan mentalitas kawanan.

Cara saya memunculkan ide ini dengan cara yang memotivasi orang untuk mengubah kode mereka adalah:

  • menulis kode sedemikian rupa sehingga mengurangi overhead kognitif pembaca (misalnya saya tidak ingat apakah ini jenis vektor pertama - atau jenis vektor kelima)
  • kode yang membuatnya lebih mudah untuk memahami maksud (mis. untuk apa vektor ini?)

(Sebagai tambahan, saya tahu buku The Joy of Clojure, sebelum penerbitan pertamanya, memiliki konsep judul Idiomatic Clojure. Jadi sepertinya menjadi alasan untuk membuat kode 'idiomatis', untuk 'membawa kegembiraan' kepada pembaca. ).

Pertanyaan saya adalah: Apakah tujuan di balik kode 'idiomatik' untuk mengurangi overhead kognitif?

Hawkeye
sumber
Komentar khas saya, vis à vis kode bacaan, adalah Anda menulis kode untuk setidaknya dua kompiler: Orang lain, termasuk Anda, yang harus membaca kode nanti. Dan proses yang Anda jalankan melalui Ant, Make, atau IDE. Yang pertama lebih penting.

Jawaban:

19

Pertama, saya tidak yakin bahwa ada semacam "kebenaran moral" dalam istilah "idiomatik". The Definisi kamus polos hanya

khas atau karakteristik bahasa atau dialek tertentu: Prancis idiomatik.

Ya, kode idiomatik umumnya mengurangi overhead kognitif, khususnya pada definisi antarmuka di mana pustaka standar dan pustaka pihak ketiga mana pun yang dibutuhkan proyek (secara virtual) semuanya idiomatis.

Namun, sebagai titik penjualan, saya akan fokus pada apa yang mengurangi overhead kognitif untuk Anda. Itu membuat lebih mudah bagi programmer untuk menemukan kesalahan karena mereka tidak berusaha untuk mengurai kode yang ditulis dalam gaya yang unik untuk mencari tahu di mana itu secara halus oleh satu atau salah penanganan tepi kasus. Itu membuatnya lebih mudah untuk meninjau kode orang lain yang membuatnya lebih mungkin bahwa tim akan melakukan tinjauan nyata yang mengidentifikasi masalah nyata daripada berdebat tentang sintaksis.

Selain mengurangi overhead kognitif, kode idiomatik umumnya adalah kode yang lebih efisien. Sebagian besar idiom dalam bahasa tertentu berkembang karena bahasa tersebut dirancang untuk mendekati masalah dengan cara tertentu. Kompiler atau interpreter yang Anda gunakan akan memfokuskan optimasi mereka pada kode idiomatik. Jika Anda menggunakan bahasa di mana rekursi adalah cara idiomatis untuk menyusun sepotong kode, misalnya, Anda bisa yakin bahwa kompiler Anda menerapkan rekursi ekor. Jika Anda menggunakan bahasa di mana rekursi bersifat non-idiomatis, itu sangat kecil kemungkinannya. Tidak mungkin rekursi ekor tidak dapat diterapkan di mana-mana, tetapi kebanyakan penulis kompiler tidak akan fokus pada hal-hal yang tidak terjadi secara umum.

Gua Justin
sumber
1
Jawaban Anda, cukup masuk akal, mengilhami reaksi ini: Prancis idiomatik, dari Paris, Montreal, Pantai Gading? Kode tidak begitu berbeda. Tidak ada idiom tanpa komunitas. Jika Anda kedengarannya seperti dari Montreal, Anda dapat menyebabkan sedikit 'kelebihan kognitif' di Paris. Mungkin dunia akan selalu terbagi antara mereka yang berpikir ada satu cara yang benar (Python?) Dan mereka yang mengatakan Vive la différence! (Javascript?). Sekarang, jika kita ingin menulis idiom Javascript yang menurut penyusun lebih efisien, mari kita semua menulis seperti minifier / uglifier!
joshp
Untungnya, ketika V8 keluar, para desainer memutuskan bahwa mereka tidak akan memainkan permainan microbenchmarks buatan lagi dan menciptakan tolok ukur yang mensimulasikan dunia nyata, diperhitungkan dengan baik, dirancang dengan baik, kode idiomatik, dan vendor lain sekarang mengikutinya. Ini menghasilkan pembalikan peran dalam permainan kinerja: sebelum itu tugas programmer untuk menulis kode untuk kinerja sehingga penulis kompiler memiliki pekerjaan yang mudah, sekarang tugas penulis kompiler untuk merancang kompiler mereka untuk kinerja, sehingga programmer memiliki pekerjaan yang mudah - yang memang seharusnya.
Jörg W Mittag
Ikan haring merah yang bagus, tetapi bahasa yang diucapkan berbagi batas geografis, bahasa komputer tidak. Jadi maksud Anda sedikit bisa diperdebatkan. Belum lagi membandingkan Python vs JavaScript dengan dialek Paris vs Montreal. (Saya tidak yakin siapa yang akan lebih tersinggung, Programmer Python atau penduduk Montreal?; D).
Marco
10

Saya tidak yakin dari mana Anda mendapatkan gagasan bahwa idiom memiliki konotasi moral. Idiom hanyalah cara untuk mengekspresikan sesuatu. Mereka adalah pola pada skala yang lebih besar daripada kata atau frasa individual.

Jika saya mengatakan kepada Anda bahwa seseorang harus melolong dengan serigala, Anda tidak akan tahu apa yang saya maksudkan, meskipun itu adalah idiom Jerman yang terkenal. Jika, OTOH, saya katakan, ketika di Roma, lakukan seperti yang dilakukan orang Romawi, Anda akan segera tahu apa yang saya bicarakan, karena saya menggunakan idiom bahasa Inggris yang tepat.

Bahasa komputer tidak berbeda.

Sebenarnya, nama alternatif untuk "idiom" di dunia pemrograman adalah "pola implementasi". Ini menghubungkan ide dengan ide pola, yang berasal dari arsitek (bata-dan-mortir bukan bit-dan-byte) Christopher Alexander. Sebagian besar programmer tahu tentang Pola Desain, beberapa tahu tentang Pola Arsitektur, yang merupakan pola pada skala yang lebih besar daripada Pola Desain. Idiom adalah pola pada skala yang lebih kecil dari pola desain.

Jörg W Mittag
sumber
5

Sebagian besar bahasa dengan sengaja menggunakan gaya tertentu. Kode yang ditulis dengan gaya itu adalah apa yang idiomatis. Jika Anda melihat melewati kenyataan bahwa Anda memilih lingkungan runtime mempersempit pilihan bahasa yang tersedia, Anda harus memilih bahasa karena masalah yang ada mudah diungkapkan dalam idiom khusus bahasa.

Kebanyakan orang tidak mengerti itu. Sebagai contoh, banyak programmer Java berusaha keras untuk mempertahankan gaya yang sama ketika mereka harus menulis JavaScript (mereka bisa menulis Java dan mengkompilasi silang, tentu saja) dan berhasil sampai batas tertentu - menulis kode yang Java-idiomatik dalam JavaScript - tetapi mereka akan selalu memiliki perasaan melawan JavaScript. Kehilangan fitur tertentu atau sulit ditiru.

Kode idiomatik itu bagus. Sulit bagi orang luar, tetapi mereka bisa belajar. Pada akhirnya, kode harus dipelihara selama bertahun-tahun, jadi jika Anda dapat menemukan bahasa di dalam idiom yang mana program yang mendasarinya dapat diekspresikan dengan cara yang sederhana, itulah yang harus Anda lakukan.

Izinkan saya mengklarifikasi bahwa pasti ada istilah idiom yang berlebihan (atau fitur bahasa yang mendasarinya). Jika Anda menggunakan template C ++ untuk mengeksekusi bagian signifikan dari logika aplikasi pada waktu kompilasi, atau jika program Lisp lengkap Anda adalah panggilan ke beberapa makro yang terungkap ke hal yang sebenarnya dalam cara yang praktis tidak dapat diprediksi, jika solusi Java Anda dari masalah sederhana mengembang ke proporsi FizzBuzzEnterpriseEdition ... Anda salah melakukannya.

Kata orang, kode harus mudah dibaca. Itu hanya setengah kebenaran. Itu harus mudah dipahami, yang mengharuskannya juga mudah untuk bernalar. Itu membutuhkan penggunaan abstraksi yang memadai . Seperti kebanyakan hal, ini adalah masalah mencapai keseimbangan yang tepat.

back2dos
sumber
Saya berharap saya bisa memberikan +1 lagi untuk tautan FizzBuzzEnterpriseEdition itu sendiri ... :-D
cmaster