Saat mengerjakan desain untuk sistem baru, apakah lebih baik memulai dengan bahasa yang diketik secara statis (seperti Haskell), atau bahasa yang diketik secara dinamis (seperti Ruby)?
Argumen yang bisa saya pikirkan:
Dengan bahasa statis, Anda dapat dengan cepat membuat spesifikasi dan ruang lingkup untuk apa yang akan dilakukan program. Dengan bahasa yang dinamis, Anda dapat dengan cepat membuat demo yang berfungsi untuk disajikan kepada pelanggan untuk ditinjau.
Dengan bahasa yang dinamis, Anda sering menghindari harus mengatur ulang struktur data dan kode refactor ketika Anda mengubah desain Anda. Dengan bahasa statis, Anda dapat menentukan jenis sebelum implementasi, menjaga kode tetap kecil.
Dengan bahasa statis, Anda harus mengetahui terlebih dahulu apa yang akan dilakukan program Anda. Dengan bahasa yang dinamis, Anda dapat mulai menulis kode, dan biarkan desain tumbuh secara organik. Seperti yang dikatakan Paul Graham dalam Hackers and Painters :
Bahasa pemrograman adalah untuk memikirkan program, bukan untuk mengekspresikan program yang sudah Anda pikirkan.
Dengan bahasa statis, kompiler dapat membantu mengidentifikasi banyak jenis bug. Dengan bahasa yang dinamis, Anda dapat mulai menguji dan menemukan bug lebih cepat.
Pengetikan statis dan dinamis keduanya memiliki kelebihan dan kekurangan sejauh prototyping yang bersangkutan. Namun, keduanya bagi saya sepertinya pendekatan yang sama-sama valid. Berdasarkan pengalaman Anda, mana yang akhirnya lebih baik?
Catatan
Prototyping dalam bahasa alami
Jenis bahasa ketiga yang perlu dipertimbangkan: bahasa alami. Alih-alih membuat prototipe dalam kode, kita dapat membuat prototipe secara tertulis. Pelanggan kemudian dapat membaca dokumentasi Anda dan mengkritik desain Anda sejak awal, tetapi tidak bisa bermain-main dengan demo yang berfungsi. Jika ditulis dengan baik, dokumentasi dapat membuat implementasi dalam bahasa apa pun secara langsung. Peringatan:
Dokumentasi mungkin membosankan untuk dibaca, dan sulit dicerna tanpa bisa melihatnya. Saya berspekulasi bahwa pelanggan lebih suka bereksperimen dengan sesuatu yang berfungsi daripada membaca dinding teks (dan gambar).
Prototyping aplikasi dalam bahasa Inggris daripada dalam definisi tipe lebih verbose dan kurang konkret.
Jenis Haskell bersifat deskriptif
Perhatikan bahwa tipe sangat deskriptif dalam Haskell, lebih daripada di banyak bahasa statis seperti C ++ dan Java. Misalnya, saya memiliki fungsi dengan tanda tangan jenis ini di Haskell:
foo :: forall a. [a] -> a
Fungsi yang, untuk tipe apa pun a
, mengambil daftar item tipe a
dan mengembalikan nilai tipe a
.
Bahkan tanpa mengetahui nama fungsinya, saya tahu pasti bahwa:
Itu tidak melakukan input / output atau mengubah nilai apa pun (well, kecuali jika menggunakan salah unafePerformIO ), karena Haskell murni berfungsi.
Itu tidak dapat memperlakukan item sebagai, katakanlah, bilangan bulat, karena harus mendukung semua jenis.
Itu harus menggunakan daftar input (itu, atau melemparkan pengecualian atau masuk ke loop tak terbatas). Kalau tidak, dari mana akan mendapatkan nilai tipe
a
?
Oleh karena itu, satu-satunya fungsi yang mungkin dapat dilakukan (selain gagal) adalah mengekstrak item dari daftar input dan mengembalikannya. Meskipun saya masih tidak tahu item mana yang akan digunakan, [a] -> a
ceritakan semua hal lainnya.
sumber
Jawaban:
Saya akan berpihak pada Paul Graham dalam hal ini: pengetikan dinamis paling berguna untuk membuat program secara organik, yang seharusnya menjadi prototipe. Intinya adalah menyelesaikan sesuatu dengan cepat yang menunjukkan fungsionalitas produk akhir, bukan produk akhir itu sendiri. Pengetikan statis adalah tentang kebenaran formal — yah, seolah-olah; setidaknya itu seharusnya (seperti dalam Haskell atau Agda) —tetapi pengetikan dinamis adalah tentang kebenaran praktis, yang lebih penting ketika Anda membuat prototipe.
Dalam bahasa yang tepat, petunjuk tipe statis dapat diberikan setelah fakta sebagai optimasi (dan untuk memberikan keamanan tambahan untuk perubahan di masa depan), atau prototipe dapat ditulis ulang dalam bahasa yang diketik secara statis setelah persyaratan telah dijelaskan dan dipadatkan oleh prototipe. .
sumber
Saya pikir masalah tipe statis vs dinamis tidak sepenting banyak orang mengatasinya.
Saya menggunakan keduanya. Kadang-kadang satu hanya lebih bermanfaat daripada yang lain dalam situasi tertentu. Ini paling sering disebabkan oleh kebutuhan untuk menggunakan beberapa alat / perpustakaan / teknologi tertentu. Jadi saya memilih yang berfungsi dengan baik dengan komponen lain yang saya miliki.
Saya pikir salah satu hal yang disukai orang tentang bahasa dinamis adalah banyak yang ditafsirkan; Anda dapat memodifikasinya saat sedang berjalan secara interaktif menggunakan konsol REPL . Bahasa apa pun dengan fungsi eval atau sesuatu yang setara dapat melakukan ini. Jadi, setidaknya untuk aspek yang satu ini sistem tipe sebenarnya tidak relevan.
Anda dapat membangun prototipe menggunakan hal-hal yang sama sekali tidak memiliki sistem tipe formal seperti skrip shell. (Mereka memang memiliki REPL ...)
sumber
Lakukan yang terbaik untuk Anda dan untuk apa yang Anda coba lakukan. Saya menemukan bahwa saya saat ini membuat prototipe terbaik dalam bahasa statis. Prototipe dengan sistem tipe ekspresif memungkinkan Anda melakukan beberapa hal keren:
Tulis tanda tangan fungsi tanpa implementasi yang sesuai. Kode Haskell tahap awal saya sering memiliki pernyataan seperti:
foo :: Foo -> Bar
foo _ = kesalahan "tidak ditentukan"
Ini karena saya ingin ide tentang apa yang
foo
terjadi ketika saya menulis kode yang menggunakannya, tanpa harus benar-benar memiliki copy pekerjaanfoo
. Dalam bahasa lain ini dilakukan dengan sesuatu sepertithrow new Exception()
, yang merupakan sesuatu yang tidak akan pernah Anda lakukan dalam kode nyata, tetapi membantu satu ton pada tahap awal.:t
GHCi (Haskell REPL) untuk menemukan apa yang baru saja saya tulis. Sebagai contoh, ini dapat memberi tahu Anda seberapa umum sepotong kode, sehingga mengungkapkan persyaratan berbagai bagian kode Anda dan struktur yang sesuai.Conal Elliot menggambarkan pandangannya tentang Haskell untuk membantu pengembangan iPhone dengan cara ini:
"Begitu saya menulis Haskell, mesin imperatif memudar dari pandangan dan saya tidak bisa tidak mulai melihat pola-pola penting. Bermain-main dengan pola-pola itu membawa saya ke wawasan baru ... Saya bersyukur memiliki bahasa malas tingkat tinggi ini dengan kaya mengetik statis sebagai alat berpikir, untuk membantu saya mendapatkan wawasan dan menghilangkan kesalahan saya. Ini bonus bagi saya bahwa bahasa juga dapat dieksekusi. " Sumber
Betul. Salah satu dewa pemrograman fungsional berpendapat bahwa nilai utama Haskell adalah bahasa pemodelan, bukan bahasa implementasi. Guru lain berpikir hal yang sama: Erik Meijer menggunakan Haskell untuk membantu memperjelas aljabar dan pola yang mendasari yang akhirnya masuk ke kerangka kerja berorientasi objek.
Alasan paling penting untuk membuat prototipe dalam bahasa yang ketat, adalah bahwa banyak hal yang ingin "prototipe" bukan aplikasi web tahap awal yang bagus yang didanai oleh Paul Graham. Seringkali Anda perlu membuat prototipe:
Dalam setiap kasus ini Anda benar-benar ingin menggunakan bahasa yang dekat dengan bahasa implementasi akhirnya dengan cara yang bermakna.
Satu nitpick
tidak memiliki "benar" (selalu berakhir tanpa menghasilkan kesalahan atau
undefined
) contoh. Itu karenaTetapi tidak ada fungsi dari
[]
ke yanga
bisa ada untuka
yang tidak memiliki instance.sumber
Apakah maksud Anda prototipe fitur atau desain ?
Prototipe fitur adalah tentang menunjukkan fitur kepada klien sebelum memulai pengembangan fitur itu dari awal dalam bahasa implementasi akhir, jadi intinya adalah menulis fitur itu secepat mungkin tanpa memperhatikan bug atau perawatan. Bahasa dinamis memungkinkan pertukaran produktivitas-kebenaran dengan memungkinkan peretasan jelek yang tidak akan diterima oleh bahasa yang diketik secara statis, yang membuat mereka, secara teori, lebih cocok untuk menulis prototipe cepat-buang. Tentu saja, dalam praktiknya, keterampilan pengembang lebih penting daripada bahasa, tetapi seorang pengkode yang sama-sama ahli dalam Haskell dan Ruby mungkin akan membuat prototipe lebih cepat di Ruby, dan kode yang dihasilkan akan berantakan.
Prototipe desain adalah tentang menemukan desain program yang sesuai melalui coba-coba. Retas yang jelek tidak berguna - hanya kemampuan untuk memperbaiki desain yang penting dengan cepat. Persyaratan mendasar untuk refactoring besar-besaran adalah serangkaian pengujian otomatis. Dalam bahasa yang dinamis, ini biasanya merupakan rangkaian tes unit yang ditulis pengembang, yang membutuhkan waktu cukup lama untuk menulis. Dalam bahasa yang diketik secara statis, tanda tangan jenis berfungsi sebagai tes otomatis dan membiarkan kompiler mendeteksi setiap inkonsistensi yang disebabkan oleh perubahan kode. Bahasa yang diketik secara statis bersinar di refactoring dengan cara yang tidak dapat dicapai oleh bahasa yang diketik secara dinamis.
sumber
Dinamis, terutama jika Anda tahu bahwa produk yang sebenarnya harus dalam salah satu dari beberapa bahasa statis populer agar cukup cepat untuk menyelesaikan masalah nyata di alam liar. Melakukan hal ini secara otomatis akan melindungi Anda dari membuat kesalahan dengan menggunakan prototipe sebagai produk akhir.
sumber
Bahasa apa pun yang paling Anda kenal.
Dinamis vs statis benar-benar tidak masalah. Fungsional vs OO benar-benar tidak masalah. Paling cocok, fitur, atau apa pun yang biasanya tidak ada artinya.
Satu-satunya titik prototyping adalah kecepatan implementasi (penulisan kode) karena Anda perlu banyak mengubah program. Dan Anda harus tercepat dengan bahasa terbaik Anda.
Jika Anda memiliki dua bahasa terbaik di kedua dinamis dan statis, saya akan bertaruh pada yang statis. Karena yang statis biasanya dapat menangani kompleksitas, sedangkan yang dinamis gagal di beberapa titik. Dan tidak ada yang tahu seberapa besar prototipe akan tumbuh.
sumber