Pemrograman melek huruf, metodologi desain baik / buruk

10

Baru-baru ini saya menemukan konsep pemrograman terpelajar . Dan saya menemukan itu agak menarik. Namun saya belum menemukan klaim bahwa itu adalah cara yang buruk untuk menyusun program. Sepertinya tidak banyak tempat tertutup. Bahkan di sini pun saya tidak dapat menemukan pertanyaan mengenai hal ini.

Pertanyaan saya bukan tentang kekurangannya atau cara menangani dokumentasi. Saya menganggap dokumentasi efek samping dari apa artinya bagi aliran pemrograman melek. Saya tahu bahwa desain awalnya dimaksudkan untuk dokumentasi yang mudah serta konsep aliran pemrograman ke depan .

Konsep membagi masalah menjadi masalah berbasis kalimat kecil tampaknya benar-benar ide yang brilian. Dengan demikian akan memudahkan pemahaman tentang aliran program.

Konsekuensi dari metode desain melek juga adalah bahwa jumlah fungsi yang diperlukan akan terbatas pada imajinasi programmer. Alih-alih mendefinisikan fungsi untuk tugas tertentu, itu bisa dibuat sebagai scrapmetode literate. Ini akan menghasilkan penyisipan otomatis kode, alih-alih kompilasi fungsi terpisah dan persyaratan berikutnya dari langkah optimasi kompilasi antar-prosedural untuk mendapatkan kecepatan yang setara. Faktanya, percobaan pertama Donald E. Knuth menunjukkan waktu eksekusi yang lebih rendah, karena fakta ini. Saya tahu bahwa banyak kompiler dapat dibuat untuk ini, namun ini bukan urusan saya.

Jadi saya ingin mendapatkan umpan balik mengapa seseorang harus menganggap ini metodologi desain yang buruk / baik?

nol
sumber
2
Zeroth, saya membuat tag pemrograman melek dan menambahkan ringkasan berdasarkan artikel Wikipedia. Tolong bantu kembangkan tag wiki dengan informasi yang relevan.
yannis
@YannisRizos Saya akan menambahkannya di sini, saya tidak memiliki hak mengedit.
Zeroth
1
Yah, saya juga :) Saya telah menambahkan beberapa sumber (artikel wikipedia, dan tautan dalam pertanyaan Anda), mereka akan muncul ketika hasil edit ditinjau dan diterima oleh rekan (?!). Ini adalah pendekatan yang menarik, dan karena Anda sudah menjelajahinya, kembalilah dan tingkatkan tag wiki setiap kali Anda menemukan sesuatu yang menurut Anda layak disebutkan di sana.
yannis
1
Saya akan merekomendasikan penulis situs Pemrograman Literate untuk mengunjungi situs UX stackexchange - warnanya sangat buruk untuk dibaca.
Danny Varod
1
FYI, ada literate-programmingtag di StackOverflow juga. Ada lebih banyak konten di sana, meskipun masih tidak banyak.
Ross Patterson

Jawaban:

9

Ini akan menghasilkan penyisipan otomatis kode, alih-alih kompilasi fungsi terpisah dan persyaratan berikutnya dari langkah optimasi kompilasi antar-prosedural untuk mendapatkan kecepatan yang setara.

Ini tidak relevan. Sudah puluhan tahun. Anda dapat menghapusnya dari pertanyaan, karena tidak masuk akal dengan kompiler modern untuk menumbangkan pengoptimal mereka.

Jadi saya ingin mendapatkan umpan balik mengapa seseorang harus menganggap ini metodologi desain yang buruk / baik?

Tidak ada downside ke pemrograman melek. (Saya mengharapkan puluhan suara untuk sentimen itu.) Sebagai seorang praktisi, saya tidak pernah melihat masalah.

Ada beberapa argumen yang menentang semua "pemrograman dalam bahasa tingkat yang lebih tinggi ditumbangkan dengan mengubah kode yang dihasilkan." Baik. Dengan cara yang sama pemrograman di C ++ ditumbangkan dengan mengutak-atik .ofile yang dihasilkan. Memang benar, tetapi tidak relevan.

Menulis program melek huruf semata-mata berarti menggabungkan desain tingkat tinggi dan terperinci (level kode) ke dalam satu dokumen, ditulis dengan toolset yang sesuai yang menghasilkan file ramah-kompiler dan file ramah-orang.

Ketika Knuth menemukan pemrograman melek huruf, bahasa OO mainstream tidak ada. Oleh karena itu banyak web asli dan alat tenun memungkinkan dia untuk membuat definisi seperti kelas untuk tipe data abstrak.

Banyak dari itu tidak relevan saat ini. Alat Pemrograman Literate bisa sangat sederhana jika mereka berfokus pada bahasa pemrograman modern, berorientasi objek tingkat tinggi (atau fungsional). Ada sedikit kebutuhan untuk penyelesaian yang rumit karena keterbatasan C (atau Pascal atau Assembler).

Pendekatan untuk menulis program melek huruf tidak berbeda dari pendekatan untuk menulis program buta huruf. Itu masih membutuhkan desain yang hati-hati, pengujian unit, dan pengkodean yang rapi. Satu-satunya pekerjaan tambahan adalah menulis penjelasan selain menulis kode.

Untuk alasan ini saja - kebutuhan untuk menulis penjelasan yang koheren - pemrograman melek huruf sulit bagi beberapa programmer. Ada cukup banyak programmer yang berhasil (kode mereka melewati semua tes unit, rapi dan mudah dimengerti) tetapi sepertinya tidak bisa menulis kalimat yang koheren dalam bahasa ibu mereka. Tidak tahu mengapa ini benar.

Ada sejumlah besar programmer yang tampaknya hanya sedikit berhasil dan kemudian hanya karena kecelakaan. (Ada cukup banyak pertanyaan buruk di Stack Overflow yang menunjukkan bahwa banyak programmer berjuang untuk memahami fundamentalnya.) Untuk programmer yang mengajukan pertanyaan stack overflow yang tidak koheren, kami tahu mereka tidak bisa melakukan pekerjaan pemrograman literasi yang baik, karena mereka dapat dapat melakukan pekerjaan pemrograman dengan baik.

S.Lott
sumber
7
Sejumlah besar programmer hampir tidak koheren ketika menjelaskan sesuatu dalam media apa pun, formal atau informal, baik itu pemrograman terpelajar, menulis komentar atau bahkan email. Ini adalah perangkat lunak yang luar biasa bekerja sama sekali :)
Andres F.
3

Aspek yang paling penting dari pemrograman melek (atau bahkan hanya komentar yang baik) bagi saya adalah tidak begitu banyak memberikan dokumentasi, tetapi lebih tepatnya menyatakan maksud dari programmer. Dalam mengetahui maksud yang dinyatakan, Anda dapat segera menilai apakah kode yang mengikutinya benar-benar melakukan apa yang seharusnya. Tanpa niat, Anda harus mulai dengan asumsi bahwa kode itu benar dan kemudian membuktikannya benar atau salah dengan induksi - yang lebih melelahkan dan memakan waktu karena sering memerlukan membiasakan diri dengan semua kode di sekitarnya juga.

Jadi, niat yang disebutkan sering memungkinkan orang lain yang tidak terbiasa dengan kode untuk dengan cepat masuk dan menemukan kesalahan tanpa harus mengetahui konteks yang lebih luas di sekitarnya.

Dan tentu saja, ini membantu Anda untuk mempelajari aliran dasar dan desain kode lebih cepat juga, karena bahasa Inggris biasa sering lebih intuitif daripada aritmatika pointer untuk kebanyakan orang.

Mike Owens
sumber
1

Meskipun agak baru dengan konsep pemrograman sampah sembarangan (dan karena itu sepertinya saya kehilangan kapalnya sepenuhnya), tampaknya sangat sejalan dengan konsep DSL .

Gagasan di balik DSL adalah untuk menyaring domain masalah menjadi tata bahasa sederhana, berorientasi bahasa yang dapat digunakan untuk membangun algoritma untuk memecahkan masalah tersebut.

Bagi saya, gagasan yang sama, atau paling tidak fondasi inti dari itu, adalah sama atau setidaknya terkait erat dengan pemrograman melek.

Di dunia asyik, misalnya, ada dorongan kuat untuk menggunakan DSL lebih teratur dan membuat DSL baru untuk memecahkan masalah umum. Dorongan ini datang dari kedua alat dalam bahasa (pembangun mudah), serta pustaka inti yang mendukung API berbasis DSL.

Mengingat bahwa tren, setidaknya di sudut dunia itu, adalah menuju pemrograman melek, saya akan mengatakan bahwa itu adalah metodologi yang baik untuk diperjuangkan.

Sayangnya, tingkat pemikiran yang diperlukan untuk membuat dsl yang baik sering melampaui kebanyakan programmer, dari apa yang saya lihat. Saya tahu saya secara pribadi berjuang dengan beberapa konsep yang dibutuhkan dari waktu ke waktu. Mungkin kesulitan ini yang mencegah teknik seperti itu untuk mendapatkan adopsi yang lebih luas.

Ini adalah kasus klasik Anda ketika menggunakan alat adalah satu hal, tetapi menciptakannya ada pada tingkat yang sama sekali berbeda.


Untuk memperluas sudut pandang saya sedikit, itu tidak banyak yang DSLs adalah hal yang sama dengan pemrograman melek huruf, melainkan bahwa mereka membuat pemrograman melek huruf jauh lebih mungkin . Terutama ketika mereka DSL bahasa alami .

Dalam versi 1.8 groovy, kemampuan DSL bahasa alami secara substansial ditingkatkan dengan penambahan rantai perintah yang lebih kuat.

Misalnya, baris kode berikut adalah pemrograman , bukan hanya kalimat semu:

drink tea with sugar and milk
move left by 30.centimeters
sendFrom "Guillaume" to "Jochen"
send from: "Jochen" to "Lidia"
Email.from "Lidia" to "Guillaume" withBody "how are you?"
contact.name "Guillaume" age 33
move left by 30.centimeters
sell 100.shares of MSFT
take 2.pills of chloroquinine in 6.hours
blend red, green of acrylic
artist.paint "wall" with "Red", "Green", and: "Blue" at 3.pm
wait 2.seconds and execute { assert true }
concat arr[0] with arr[1] and arr[2]
developped with: "Groovy" version "1.8-beta-2"

Catatan: Contoh kode berasal dari blog Guillaume Laforge

Gagasan inti di balik pemrograman melek huruf adalah bahwa bahasa alami lebih mudah dipahami oleh manusia dan itulah yang penting. Menurut saya, kemampuan DSL bahasa alami Groovy menjadikan kenyataan itu lebih dekat. Terutama ketika mereka DSL digunakan untuk membuat aturan bisnis untuk suatu aplikasi.

Mampu "menyandikan" komponen-komponen penting dari suatu sistem menggunakan bahasa alami adalah inti dari pemrograman melek. Harus menyelingi bahasa alami dengan potongan kode adalah bentuk pemrograman literat yang terbastardisasi. Meskipun bermanfaat, saya percaya bahwa DSL bahasa alami yang memungkinkan Anda untuk menggunakan bahasa alami sebagai kode itu sendiri adalah lompatan besar ke depan.

Memperluas kemampuan pemrograman secara umum adalah langkah selanjutnya dalam proses, tetapi sebagian besar alat untuk melakukannya sudah ada. Ya, belum ada DSL "umum", tetapi untuk domain yang lebih kecil, kemampuannya ada.

Untuk lebih banyak contoh tindakan ini (tanpa urutan tertentu):

cdeszaq
sumber
2
Sudut pandang yang menarik. Dari sudut pandang saya, itu sama sekali tidak sejalan dengan DSL. Karena pemrograman melek dalam beberapa bahasa non-DSL. Dan alatnya tidak jauh seperti DSL. Mereka tidak berorientasi pada domain masalah. Bisakah Anda memberikan contoh bagaimana menurut Anda pemrograman melek seperti DSL? Tautan atau referensi ke contoh dapat membantu memperjelas jawaban Anda.
S.Lott
Salah satu contohnya adalah rantai perintah di Groovy 1.8 yang memungkinkan Anda "memprogram" hal-hal seperti turn left then rightatau paint wall with red, green and yellow: docs.codehaus.org/display/GROOVY/…
cdeszaq
@ S.Lott - Saya setuju bahwa pasti ada perbedaan antara DSL dan pemrograman melek huruf, tapi saya pikir DSL mungkin merupakan alat untuk mencapai pemrograman literasi sejati di mana Anda dapat mengetik bahasa natural-ish dan minta algoritma yang diinginkan diekspresikan. Bagi saya, mencampurkan bahasa dan kode alami adalah bentuk literasi yang terbastardisasi.
cdeszaq
"Anda dapat mengetik bahasa natural-ish dan mengekspresikannya dengan algoritma yang diinginkan" tidak mungkin yang terbaik. Ada latar belakang, pembenaran, bukti kebenaran, pernyataan kompleksitas (big- O ) dan banyak dokumentasi pendukung non-alogrithmic yang bukan bagian dari skema DSL. Saya tidak yakin saya setuju dengan paralelnya sekarang setelah Anda mengklarifikasi.
S.Lott
1
+ msgstr "penjelasan dari logika program". Bukan logika itu sendiri. Tapi penjelasan. Logikanya jarang jelas. Itu tidak pernah berisi bukti kebenaran (itu sulit dan kadang-kadang tidak mungkin). Jarang berisi justifikasi kompleksitas big-O. Dan itu jarang menjelaskan alternatif yang lebih rendah kinerja atau lebih banyak memori. Jadi, saya akan menyarankan bahwa DSL kurang dari "penjelasan".
S.Lott
-2

Saya pikir ini adalah kesalahan untuk berpikir bahwa LP adalah semacam DSL. Karena LP adalah - jurnal (dengan diagram, skema, fragmen kode semu, yaitu bongkahan) dari program yang dikembangkan, arsitekturnya dan sebagainya ... Ini benar-benar analog dari notebook kertas - banyak pengembang yang menggunakannya tetapi setelah menyelesaikan program - jatuhkan buku catatan, kertas ...

Dahulu kala masing-masing ahli fisika, astonomer, ahli kimia / alkemis, ahli matematika memiliki buku catatan, manuskrip dengan banyak skema, informasi yang diperlukan, tabel, dan tanpa mereka Anda dapat memahami atau mengulangi pengalaman sukses mereka, hasilnya. Dan selalu antara orang-orang seperti itu ada manuscreepts / notebook berburu.

Saat ini banyak programmer menulis kode, dan terkadang mereka menambahkan komentar! Program Byt bukan hanya kode - itu pikiran, ide, imajinasi, konsep, dan ketika pengembang baru mewarisi kode asing - ia sering menemukan semua ide dan konsep, membuat "celah" dan "jalan belakang" yang berbeda, saya harap Anda mengerti saya :)

Jadi, persyaratan utama untuk LP (sebagai alat!) Juga memungkinkan semua ini dengan sintaks yang sederhana, mudah dibaca. Saya mencoba banyak alat LP, tetapi hari ini saya sedang mengembangkan sendiri - NanoLP ( http://code.google.com/p/nano-lp/ ) yang bertujuan untuk memenuhi permintaan ini.

Paul-AG
sumber