Apa yang lebih baik untuk membuat prototipe: bahasa yang diketik secara statis, atau yang diketik secara dinamis? [Tutup]

8

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 adan 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] -> aceritakan semua hal lainnya.

Joey Adams
sumber
4
Mana pun yang lebih ekspresif.
dietbuddha
1
Anda menyebutkan bahasa alami, tetapi Anda lupa pemrograman dengan Powerpoint (atau Photoshop). Banyak orang menemukan ini sangat berguna juga.
sylvanaar
Saya pikir sejumlah argumen tentang bahasa dinamis versus bahasa statis salah arah. Sebagai contoh saya tidak percaya itu benar sama sekali bahwa Anda menghindari keharusan mengatur ulang struktur data dan kode refactor ketika Anda mengubah desain Anda dalam bahasa yang dinamis. Bahasa dinamis memang menghemat waktu karena tidak harus membuat deklarasi variabel. Tetapi Anda juga harus men-debug lebih banyak kesalahan tipe. Demikian pula dengan program bahasa statis tumbuh secara organik juga. Anda mungkin menentukan tipe konkret untuk struktur data tetapi itu tidak sama dengan menentukan secara langsung desain untuk program ....
Cervo

Jawaban:

8

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. .

Jon Purdy
sumber
2
Bahasa yang dinamis menghilangkan info jenis; ini membuatnya sangat singkat. Anda dapat dengan mudah memeriksa struktur apa pun yang Anda miliki, karena kompiler tidak pernah berusaha mengoptimalkannya dengan berat. Ketika saya perlu menulis potongan kode yang rumit secara algoritmik, saya mulai dengan Python; jauh lebih mudah untuk mendapatkan implementasi yang lambat tapi benar di atasnya. Lalu saya porting ke Java, menggunakan struktur data yang optimal, dll. Dengan Haskell, saya mungkin akan menggunakan Clojure sebagai pasangan.
9000
6

Saya pikir masalah tipe statis vs dinamis tidak sepenting banyak orang mengatasinya.

  1. 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.

  2. 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.

  3. Anda dapat membangun prototipe menggunakan hal-hal yang sama sekali tidak memiliki sistem tipe formal seperti skrip shell. (Mereka memang memiliki REPL ...)

sylvanaar
sumber
+1 untuk perpustakaan, saya tidak menggunakan Python karena dinamis, tetapi karena termasuk baterai .
Matthieu M.
4

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 footerjadi ketika saya menulis kode yang menggunakannya, tanpa harus benar-benar memiliki copy pekerjaan foo. Dalam bahasa lain ini dilakukan dengan sesuatu seperti throw new Exception(), yang merupakan sesuatu yang tidak akan pernah Anda lakukan dalam kode nyata, tetapi membantu satu ton pada tahap awal.

  • Tulis kode tanpa menulis jenis terlebih dahulu, dan gunakan inferensi jenis untuk mempelajari hal-hal tentang kode Anda. Saya sering memanggil :tGHCi (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:

  1. Perluasan untuk infrastruktur saat ini
  2. API untuk bahasa tertentu
  3. Arsitektur, bukan hanya fitur baru

Dalam setiap kasus ini Anda benar-benar ingin menggunakan bahasa yang dekat dengan bahasa implementasi akhirnya dengan cara yang bermakna.

Satu nitpick

 foo :: forall a. [a] -> a

tidak memiliki "benar" (selalu berakhir tanpa menghasilkan kesalahan atau undefined) contoh. Itu karena

[] :: forall a. [a]

Tetapi tidak ada fungsi dari []ke yang abisa ada untuk ayang tidak memiliki instance.

Philip JF
sumber
4

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.

Victor Nicollet
sumber
0

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.

segera
sumber
0

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.

Eonil
sumber