Apakah Haskell benar-benar bahasa para genius dan akademisi?



Saya pernah berdiskusi dengan pendiri startup Israel yang mengembangkan basis data GPU dengan fokus pada kecepatan. Tumpukan pekerjaan termasuk Haskell dan C ++, antara lain, dan pendiri mengeluh tentang betapa sulitnya menemukan programmer yang kompeten. Yang merupakan alasan dia datang ke Moskow.

Dengan hati-hati saya bertanya apakah mereka menganggap menggunakan sesuatu yang lebih populer dan baru. Dan meskipun jawabannya agak sopan dan didukung dengan argumen, itu tetap terdengar seperti "Ayo, jangan bawa mainan ini".

Sampai saat itu, semua yang saya dengar tentang Haskell dapat diringkas sebagai "sangat SANGAT hati-hati dalam menghadapinya". Untuk mengenal programmer Haskell lebih baik, saya datang ke obrolan Telegram topikal dengan beberapa pertanyaan. Awalnya saya agak takut, dan ternyata saya benar.

Haskell tidak memberikan penjelasan populer, dan orang-orang tampaknya bahkan tidak mencoba. Jika topik tersebut pernah diangkat, itu hanya dibicarakan secara mendalam dan seobjektif mungkin. Seseorang menulis kepada saya: “Salah satu fitur yang menentukan dari Haskell sendiri dan komunitasnya adalah bahwa mereka tidak mencoba untuk mencapai segala bentuk pengakuan arus utama. Alih-alih, mereka fokus membangun cara logis dan utama untuk menyelesaikan masalah nyata dengan mencoba menenangkan audiens seluas mungkin ”

Meskipun demikian, beberapa orang memang bercerita tentang pengalaman mereka, yang ditunjukkan di bawah ini.

Denis Mirzoev ( nolane ) : Ketika saya masih di perguruan tinggi, mereka telah menawarkan saya untuk melakukan kursus Coursera di Haskell untuk mendapatkan kredit tambahan. Kemudian kami juga memiliki kursus pemrograman fungsional yang menyertakan Haskell. Saya telah menulis salah satu makalah saya, ditambah kertas kelulusan, di GHC. Kemudian saya menemukan pekerjaan sebagai programmer Haskell.

Itu, dan masih, sulit. Ketika Anda mulai belajar Haskell, Anda harus menjejalkan banyak konsep baru ke dalam pikiran Anda. Ini seperti belajar kode dari awal lagi.

Orang-orang cenderung melupakan (atau memuluskan) ingatan mereka sebelumnya: seperti ketika mereka berjuang untuk memahami apa “penunjuk”, “fungsi” atau “kelas” itu. Mungkin itu sebabnya sulit bagi mereka untuk mempelajari Haskell: semakin sulit untuk mempelajari hal-hal baru dengan bertambahnya usia.

Doctor_Ryner : Suatu kali saya gagal masa percobaan saya di suatu pekerjaan karena persetan Redux, jadi saya mencoba untuk sedikit lebih nyaman dengan menonton video dari penciptanya. Pertama saya berlatih dalam JavaScript, tetapi kemudian saya belajar tentang Haskell, yang dianggap sebagai bahasa fungsional "benar". Saya terpesona dengan konsep uniknya dan seberapa rapi itu.

Namun, tutorial tidak terlalu ramah pengguna, ditambah latar belakang imperatifnya mencegah konsep baru muncul.

Yuri Syrovetskiy ( cblp ) : hal tersulit adalah mempelajari Haskell sebagai bahasa kedua Anda, ketika ingatan dari belajar yang pertama masih segar,

Apa yang baik dan buruk dari Haskell?


Doctor_Ryner : Ringkas, elegan, dan fleksibel. Tidak heran setengah dari perpustakaan ada di EDSL (atau setidaknya rasanya seperti itu).

Yuri Syrovetskiy : Mudah (secara subyektif) mengadaptasi pikiran Anda ke kode, ia memiliki keseimbangan paradigma imperatif dan fungsional yang besar. Membangun abstraksi data dan algoritma agak sederhana, yang memungkinkan untuk memikirkan tugas yang ada tanpa terganggu oleh sedikit gangguan.

John Doe : Typization yang ketat, kuat (bahkan fasis, saya katakan).

Igor Shevnin ( interphx ) : Sistem tipe yang bagus. Ini tidak sekuat di Idris atau Agda, tetapi masih mencapai titik tengah yang nyaman di mana Anda dapat menggambarkan hampir semua hal, namun tipe inferensi bekerja dengan baik. Anda tidak harus menandai secara manual setiap kali.

Tetapi sistem tipe yang kuat memaksa Anda untuk lebih memperhatikan nilai yang dikirimkan. Sekumpulan definisi tipe bisa terlihat seperti boilerplate. Setiap perintah memiliki set ekstensi sendiri, atau tidak memilikinya sama sekali. Kode ini “lebih padat” - setiap string sering membawa lebih banyak informasi daripada dalam bahasa lain, jadi lebih sulit dibaca untuk pengembang yang tidak berpengalaman.

Doctor_Ryner : Ketika mempelajari Haskell, Anda mungkin akan menemukan pepatah ini: "Jika dikompilasi, itu mungkin benar". Null tidak ada, paradigma fungsional itu sendiri sangat ketat dan membuat Anda tetap dalam pedoman tertentu, yang dalam banyak kasus mengarah ke desain yang lebih baik.

Misalnya, Haskell tidak memiliki variabel - hanya konstanta. Anda tidak harus melacak apa yang ditugaskan di mana. Haskell memberi insentif penggunaan fungsi "murni", yang tidak memiliki efek samping. Desain fungsional memaksa program untuk bekerja secara keseluruhan, tidak seperti bahasa berorientasi objek, di mana banyak objek mencoba berkomunikasi satu sama lain menggunakan efek samping ini, mengubah aplikasi menjadi kekacauan yang tidak dapat diprediksi. Kami telah menderita ini dalam C # dan Unity banyak di tempat kerja.

Denis Mirzoev : Ketika bahasa itu secara alami “malas”, umumnya lebih ekspresif. Algoritma menjadi lebih sederhana. Jika hasil antara tidak digunakan, itu sangat meningkatkan kinerja.

Igor Shevnin : "Kemalasan" sering membantu, tetapi ketika urutan fungsi itu penting, kadang-kadang sangat sulit untuk memahami apa yang terjadi.

Doctor_Ryner : Jika sesuai, itu mungkin cukup cepat.

Denis Mirzoev : Dari segi kinerja, ini sebanding dengan Java, tetapi tidak secepat C.

Igor Shevnin : Ini memiliki dukungan ekstensi di luar kotak, yang memungkinkan Anda untuk menyesuaikan bahasa dan sistem tipe sesuai keinginan Anda. Ada banyak ekstensi yang banyak digunakan oleh komunitas dan memiliki sampel dan dokumentasi yang layak.

Doctor_Ryner : Pustaka Prelude standar memiliki banyak fungsi buruk seperti membaca, kepala, readFile, yang dapat membuang pengecualian dan merusak aplikasi alih-alih mengembalikan Mungkin. Jadi saya harus menggunakan alternatif atau menulis sendiri.

Igor Shevnin : masalah terbesar adalah kurangnya standar, ke titik di mana banyak orang mengganti perpustakaan standar dengan salah satu alternatif, yang sama sekali tidak kompatibel satu sama lain. Perpecahan komunitas tentang apa yang seharusnya menjadi perpustakaan standar, apa yang harus dimasukkan dalam distribusi inti dan apa yang bisa diturunkan ke ekstensi ... Dalam pikiran saya, itu menghambat pengembangan bahasa.

Denis Mirzoev : Tidak memiliki alat: tidak ada IDE yang tepat, sangat sedikit tolok ukur kinerja, tidak ada debugging "langkah-demi-langkah" - ini adalah masalah mendasar.

Proyek apa yang paling cocok untuk Haskell?


YS : Untuk tugas-tugas kompleks, keamanan dan terkait keuangan, di mana kesalahan itu mahal.

Doctor_Ryner : Untuk semua yang Anda perlukan untuk menghitung, mengonversi, dan menganalisis. Saya terkejut Haskell kurang populer dalam aplikasi Data Science daripada Python.

IS : Saya tidak akan mengambil risiko menggunakannya untuk sistem embedded (cepat, tetapi masih ada overhead memori yang signifikan karena komputasi "malas") atau skrip kecil (di mana sifatnya yang ketat tidak diperlukan). Penting juga untuk memahami betapa sulitnya menemukan pengembang dibandingkan dengan bahasa umum.

John Doe : Untuk menulis kode industri yang akan dibaca oleh orang lain, tetapi Anda memerlukan seluruh tim pengembang Haskell. Tidak banyak dari mereka.

IS : Tetapi berkat sifatnya yang ringkas dan ketat, Anda dapat menggunakan Haskell untuk hampir semua hal.

Apakah ide yang baik untuk memulai karir pengembangan Anda dengan Haskell?


IS : Mungkin tidak, karena mayoritas basis kode yang harus dikerjakan pengembang tidak tertulis di dalamnya.

John Doe : Gagasan buruk! Bahasa non-ML - yang hampir semuanya dalam aplikasi industri - akan mengejutkan Anda.

DS : Seringkali orang belajar matematika terlebih dahulu, dan beralih ke pemrograman nanti. Jadi secara teoritis, belajar bahasa yang membutuhkan banyak konsep matematika (tipe data aljabar, fungsi murni) harus lebih mudah daripada bahasa imperatif. Saya pikir itu ide yang bagus.

Doctor_Ryner : Semua pengembang pemula saya bekerja dengan saya perkenalkan ke Haskell terlebih dahulu. Orang-orang yang tidak memiliki bawaan gaya imperatif jauh lebih cepat untuk mempelajari kode fungsional, dan bahkan ketika mereka bekerja dengan bahasa berorientasi objek kemudian, mereka cenderung menggunakan solusi arsitektur yang baik karena mereka terbiasa dengan itu.

YS : Yang terbaik adalah memulai dengan beberapa bahasa yang berbeda secara mendasar, misalnya C, Haskell dan Smalltalk, dalam urutan apa pun. Tidak ada satu bahasa yang bisa memberi Anda pemahaman penuh tentang lanskap.

Haskell adalah bahasa yang cukup lama. Apakah itu baik atau buruk?


YS : Bahasa ini dikembangkan sangat aktif, tidak menyeret berat kompatibilitas ke belakang untuk itu.

John Doe : itu distandarisasi pada tahun 1998, tetapi Anda tidak akan menyadarinya: hingga hari ini, kira-kira setiap 6 bulan ada versi kompiler baru yang berpotensi merusak kompatibilitas.

DS : Haskell belum tua, itu hanya mencoba dan diuji. Itu tidak (dan tidak akan pernah) melakukan perubahan tanpa berpikir. Jadi itu mungkin baik untuk kesehatan masyarakat.

Sering dikatakan bahwa Haskell adalah salah satu bahasa yang paling sulit dipelajari. Benarkah itu?


Doctor_Ryner : Sebagai bahasa itu sendiri - tidak. Bagian tersulit adalah abstraksi yang digunakannya. Seseorang yang belum pernah melihat kode Haskell sebelumnya bisa menjadi gila karena banyaknya informasi baru dan instruksi aneh. Apa yang tidak membantu adalah bahwa bahasa “membatasi” banyak hal yang tidak sesuai dengan konsep fungsionalnya.

John Doe : Butuh waktu dua bulan untuk membuat buku teks pengantar tidur, manual dan tutorial hanya untuk mendapatkan proyek pertama saya untuk dikompilasi. Pikiran, begitu akhirnya dikompilasi, itu langsung bekerja di bawah beban penuh (rata-rata 6k RPS, dengan puncak 15k) selama setengah tahun tanpa perubahan apa pun.

DS : Saya berani bertaruh bahwa jika Anda memberikan Haskell seorang mahasiswa sebagai bahasa pertama dan ia melakukannya dengan baik, maka pemrograman imperatif akan terlihat rumit dan kurang intuitif baginya.

IS : Itu semua relatif. Di luar bahasa umum, saya menganggap C ++ yang paling sulit. Bahasa yang membuktikan teorema (seperti Agda atau Coq) lebih sulit daripada Haskell secara konseptual. Haskell bukan bahasa yang sulit, tetapi butuh waktu untuk mempelajari pola dan pustaka (standar dan pihak ketiga).

Apakah kompleksitasnya dibenarkan?


IS : Pola dan tingkat abstraksi yang tinggi dibenarkan, karena membuat kode lebih pendek dan lebih tahan lama. Tapi saya pikir operator, nama fungsi dan banyak hal lain bisa sedikit lebih ramah pengguna.

Doctor_Ryner : Seringkali kompleksitas Haskell memungkinkan Anda membuat solusi yang sangat singkat, fleksibel, dan modular.

YS : Saya akan mengatakan hanya kontrol efek yang sedikit miring, meskipun hampir selalu lebih baik daripada tidak ada kontrol. Dan ada proyek yang sedang berlangsung untuk membuatnya lebih sederhana.

John Doe : Bagi orang-orang yang terbiasa dengan Python / PHP / apa pun, Haskell merasa copot dari kenyataan. Bagi Anda yang belum tertarik pada teori kategori, sangat sulit untuk belajar dari awal. Tetapi ketika Anda memahaminya, Anda menemukan pendekatan baru untuk memecahkan masalah.

Sering dikatakan Haskell bukan bahasa untuk pengembang, tetapi untuk ahli matematika. Apakah ini alasannya bukan arus utama?


DS : Ini menampilkan ide utama pengembang utama Haskell - “hindari kesuksesan dengan segala cara”. Bukan berarti "hindari kesuksesan", tetapi "hindari kesuksesan yang terlalu mahal".

Mereka bisa membuat Haskell populer. Misalnya, Microsoft mendukung bahasa tersebut. Mereka bisa membuatnya lebih penting, mengorbankan kekakuan untuk popularitas. Ada banyak trik kotor yang bisa mereka gunakan, tetapi tidak pernah dilakukan.

Tentu, bahasanya tidak populer, tetapi itu artinya kualitasnya tidak berkurang. Keuntungan Haskell dibandingkan dengan bahasa imperatif sudah jelas bagi saya dan masalahnya semua bisa diselesaikan, jadi saya percaya itu akan menjadi populer nanti.

YS : Hanya orang yang tidak tahu apa-apa tentangnya yang mengatakan demikian. Haskell banyak digunakan dalam pengembangan "dunia nyata", Anda mungkin bisa menemukan contoh di mesin pencari favorit Anda. Secara khusus, kami di Kaspersky Labs sangat senang dengan Haskell dan tidak akan menukarnya dengan yang lain.

IS : Apa itu "bahasa matematika"? Entah R / MatLab / Mathematica dibangun khusus untuk statistik dan perhitungan, atau Python karena lebih sederhana dan tidak memerlukan banyak latar belakang teknik. Tapi tidak dengan Haskell. Ini memiliki barang-barang dari aljabar, seperti monoids, tetapi memiliki aplikasi praktis.

Alasan mengapa C / C ++ / Java sangat populer adalah karena mereka secara historis sudah sangat luas di ruang perusahaan. Mereka mengisi ceruk. Tetapi saat ini banyak perusahaan mulai menggunakan Haskell dan bahasa fungsional lainnya.

PL apa yang akan Anda bandingkan dengan Haskell?


John Doe : keluar dari yang populer, mungkin dengan Erlang. Tetapi Erlang lebih mudah dipelajari dan ditulis.

DS : Saya tahu C, C ++, Java dan Haskell. C ++ mengerikan dan tidak bisa dibandingkan dengan apa pun. C sangat bagus untuk pengembangan tingkat rendah. Di semua aplikasi lain saya lebih suka Haskell.

Memilih antara Java dan Haskell lebih sulit, tetapi itu tergantung pada aplikasinya. Sebagai contoh, Java lebih baik untuk Android, tetapi dalam aplikasi server mereka hampir sama. Jika lingkungan - alat, perpustakaan - memungkinkan, saya sering memilih Haskell.

Doctor_Ryner : Saya membandingkan dengan C #. Hanya Google "bagaimana melakukannya Mungkin dalam C # dan Haskell". Sungguh aneh bahwa bahasa yang sangat fungsional seperti Haskell terasa jauh lebih fleksibel dan gratis. Namun pada kenyataannya, mereka adalah kutub yang berlawanan.

C # adalah salah satu bahasa yang paling berorientasi objek, dan kelebihannya berbeda dengan Haskell. C # selalu memaksa Anda untuk menulis banyak hal tambahan, yang memperlambat kode dan sering membuatnya kurang elegan. Setelah solusi Haskell singkat dan rapi, sulit untuk kembali.

IS : Dengan Rust, dan sejauh ini Rust mungkin menang. Dibutuhkan banyak dari Haskell dan bahasa fungsional lainnya, tetapi menggabungkan pendekatan fungsional dan imperatif, ditambah pengembang telah menangani pengembangannya jauh lebih pintar.

Apa pendapat Anda tentang komunitas Haskell?


John Doe : Sebagian besar orang sangat ramah dan siap membantu, yang sangat kontras dengan banyak bahasa lainnya.

Doctor_Ryner : Komunitas Haskell seringkali penuh dengan orang-orang pintar yang menakutkan. Meme lokal tentang PhD dan akademisi ada karena suatu alasan. Di komunitas lain, kebanyakan orang membahas masalah produksi reguler dan struktur data, sedangkan dalam obrolan Haskell orang mendiskusikan monad, fungsi aplikator, tipe gila, dan hal-hal seperti itu.

Anda selalu belajar sesuatu yang bahkan tidak pernah Anda pikirkan sebelumnya.

Dikatakan bahwa pengembang Haskell terlalu penuh dengan diri mereka sendiri. Apakah itu benar


DS : Ya. Saya merasa seperti itu karena mereka benar-benar menyukai bahasa mereka dan kecewa betapa tidak populernya bahasa itu.

John Doe : Tidak ada yang seperti itu.

Doctor_Ryner : Orang mungkin mengatakan itu karena banyak pengembang arus utama merasa terganggu dengan Haskellist mulai berbicara tentang pemrograman fungsional dan fasilitasnya. Sementara itu, Haskellist merasa kesal karena tidak ada yang mendengarkannya dan mulai melemparkan terminologi, dan karenanya dicap "penuh dengan dirinya sendiri".

IS : Agak sulit menyebut mereka seperti itu. Mungkin karena pemrograman fungsional, OOP, perbedaan antara kelas-OOP dan jenis-jenis serikat, masalah ekstensi dan banyak definisi lainnya perlahan-lahan berkembang menjadi satu gambar yang koheren, dan kemudian sulit untuk memahami orang-orang yang melanjutkan perang suci OOP vs FP.

Mengapa bahasa FP sangat khusus?


DS : Keuntungan mereka tidak cukup untuk menarik minat programmer. Sulit untuk belajar juga tidak membantu. Masalah alat juga menakut-nakuti orang, meskipun masalah itu mungkin akan diselesaikan jika lebih banyak orang tertarik. Itu adalah lingkaran setan.

IS : Ya, konsep FP perlahan-lahan mengalir ke bahasa lain ...

Doctor_Ryner : Prinsip-prinsip inti FP dan bahasanya sudah cukup luas. Bahkan Sharp memiliki Linq dan beberapa perpustakaan serupa lainnya. Tetapi bahasa murni fungsional mungkin hanya memiliki terlalu banyak konsep novel untuk menjadi populer.

Jangan lupa bahwa 20 tahun yang lalu perangkat kerasnya belum cukup cepat untuk menangani bahasa fungsional, jadi baru saja masuk ke arus utama, dan Haskell sendiri hanya berkembang.

Source: https://habr.com/ru/post/id441350/


All Articles