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.