Selama empat tahun saya di universitas, kami telah menggunakan banyak pemrograman fungsional dalam beberapa bahasa pemrograman fungsional. Tetapi saya juga telah menggunakan banyak pemrograman berorientasi objek, dan pada kenyataannya saya lebih banyak menggunakan bahasa berorientasi objek ketika melakukan proyek kecil saya sendiri untuk mempersiapkan pekerjaan pertama saya. Tetapi saya sering berharap bahwa saya mengkode dalam bahasa pemrograman fungsional ketika melakukan proyek-proyek ini.
Namun, ketika mencari pekerjaan, sangat jarang untuk melihat pekerjaan di mana pengetahuan tentang bahasa pemrograman fungsional diperlukan.
Mengapa bahasa pemrograman fungsional lebih banyak digunakan di industri? Ada cukup banyak berita tentang bahasa pemrograman fungsional hari ini, jadi saya bertanya-tanya apakah pemrograman fungsional menarik di industri sekarang?
sumber
Jawaban:
Saya akan mengatakan bahwa salah satu alasan bahwa pemrograman fungsional tidak lebih lazim adalah kurangnya basis pengetahuan. Pengalaman saya adalah bahwa perusahaan sangat menentang risiko dalam hal menerapkan teknologi yang bukan arus utama dan lebih suka berinvestasi dalam kerangka kerja yang sudah terbukti dan benar (java, c ++, c #). Hanya ketika ada kebutuhan bisnis (seperti di Ericsson) yang dipertimbangkan paradigma baru. Tetapi bahkan dalam kasus Ericsson saya mendengar bahwa manajemen menuntut agar c ++ digunakan dan Joe Armstrong dipaksa untuk mengkode panggilan erlang di c ++ !! Ini harus menunjukkan bagaimana perusahaan yang enggan menerapkan teknologi baru!
sumber
Saya adalah seorang profesor dan, seperti halnya programmer, profesor selalu mencari Hal Besar Berikutnya. Ketika mereka berpikir bahwa mereka telah menemukan satu, mereka membuatnya sebagai kereta musik, dan semua orang menumpuk. Karena mereka berkhotbah kepada siswa yang berpikir bahwa profesor harus benar-benar pintar, jika tidak, mengapa mereka menjadi profesor, mereka tidak mendapat perlawanan.
Pemrograman fungsional adalah semacam kereta musik. Tentu ada banyak pertanyaan menarik untuk diselidiki, dan banyak artikel konferensi yang menarik untuk ditulis. Ini bukan ide yang sangat baru, dan Anda dapat melakukannya di hampir semua bahasa modern, dan ide-ide tidak harus baru untuk menjadi menarik. Ini juga keterampilan yang baik untuk dimiliki.
Karena itu, pemrograman fungsional hanya satu panah yang ada di quiver Anda, bukan satu-satunya, sama seperti OOP bukan satu-satunya.
Daging sapi saya dengan akademisi sains komputer adalah kurangnya interaksi praktis dengan industri untuk menentukan apa yang sebenarnya masuk akal di dunia nyata, yaitu kontrol kualitas. Jika kontrol kualitas ada di sana, mungkin ada penekanan yang berbeda, pada masalah klasifikasi dan rentang solusi untuk mereka, dengan pengorbanan, bukan hanya kereta musik terbaru.
sumber
Karena masalah terbesar dalam pengembangan perangkat lunak saat ini adalah kemampuan untuk mengelola kompleksitas. Ini bukan fokus dari sebagian besar bahasa pemrograman fungsional. Dengan demikian, bahasa yang melakukan membuat prioritas (yaitu bahasa OOP lebih populer) cenderung hanya mencuri beberapa fitur pendingin yang keluar dari bahasa fungsional lebih akademis dan sebagainya tetap di atas.
sumber
Pemrograman fungsional jelas mulai menangkap - perlahan tapi pasti.
Misalnya, startup yang saya bangun menggunakan bahasa fungsional (Clojure) sebagai bahasa pengembangan utama karena alasan berikut:
Produktivitas - belajar FP itu sulit, tetapi begitu Anda terbiasa, sangat sulit dikalahkan dalam hal kekuatan dan ekspresif. Saya mungkin menulis sekitar 1/10 dari jumlah baris untuk mengimplementasikan fungsi apa pun yang diberikan dibandingkan dengan apa yang saya perlukan di C # atau Java
Keandalan - fungsi murni jauh lebih mudah untuk dipikirkan dan diuji daripada objek stateful. Karenanya Anda dapat menulis tes yang lebih baik dan memvalidasi kebenaran kode Anda dengan lebih mudah.
Konkurensi - bahasa fungsional menekankan keabadian, yang memiliki manfaat sangat besar untuk aplikasi berbarengan daripada harus berjalan secara efektif pada banyak core. Dan suka atau tidak, berjalan di beberapa core adalah masa depan. Lihat http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey untuk penjelasan yang cemerlang tentang mengapa ini sangat penting
Composability / modularity - bahasa fungsional tampaknya cocok untuk memasukkan komponen bersama-sama lebih mudah daripada sistem OO yang kompleks. Saya masih belum menemukan semua alasan untuk ini, tetapi sebagian darinya berasal dari kenyataan bahwa Anda tidak memiliki semua "kerumitan insidentil" yang model OO seret dengan mereka. Pembicaraan tentang Kesederhanaan Radikal oleh Stuart Halloway mengeksplorasi ide-ide ini secara lebih mendalam.
EDIT : Menanggapi komentar Despertar, contoh "kerumitan insidental" dari sistem OOP yang membatasi modularitas adalah masalah dengan kloning mendalam vs kloning dangkal: Anda tidak dapat menyusun objek bersama-sama dan membagikannya sebagai struktur komposit tanpa analisis yang cermat tentang semantik kloning dan mutasi. Dalam kasus kecil ini dapat dikelola, tetapi dalam sistem yang kompleks itu dengan cepat menjadi masalah yang signifikan. Masalah ini tidak akan ada di tempat pertama jika Anda mengandalkan struktur data fungsional murni.
sumber
Kurangnya aplikasi pembunuh
Hei, yang ini terlihat segar. (gali gali)
Saya pikir sebagian besar bahasa pemrograman berkembang dengan memiliki "aplikasi pembunuh" - sesuatu yang menarik yang eksklusif untuk bahasa (atau dilihat seperti itu). Ini bukan untuk mengatakan bahwa semua serapan adalah bahwa aplikasi, tetapi itu melaju bahasa untuk penerimaan yang lebih besar.
Inilah pandangan saya yang tidak terlalu akurat tentang niche apa yang mendorong adopsi beberapa bahasa yang kita miliki saat ini:
Selain itu, banyak bahasa yang dipatenkan telah masuk melalui organisasi penjualan yang kuat (Oracle, dan sedikit banyak bahasa Microsoft), yang secara efektif menciptakan ceruk mereka sendiri.
Satu catatan yang sangat penting tentang daftar itu: "Niche" bahasa, seperti yang ditunjukkan oleh aplikasi pembunuh, menjadi lebih dan lebih spesifik ketika beberapa dekade berlalu. Perhatikan yang terakhir dalam daftar: Game scripting , khususnya. Semakin sulit bagi bahasa untuk mendapatkan perhatian karena daftar hal-hal yang sudah dilakukan dengan cukup baik oleh bahasa lain.
Jadi, apa bahasa fungsional apa pun perlu benar-benar lepas landas adalah ceruk. Pada kenyataannya, belum ada bahasa fungsional yang besar, tetapi ada banyak di ceruk yang lebih kecil:
Sekarang, satu-satunya bahasa utama yang saya rasa tidak saya bahas dalam diskusi ini adalah Python. Python telah melakukan sesuatu yang sangat menarik; itu telah berhasil tanpa terlihat menjadi pemenang di ceruk utama mana pun. Ini bisa berarti bahwa saya salah untuk melihat popularitas bahasa dengan cara ini. Ini juga bisa berarti bahwa bahasa yang cukup baik dapat menjadi populer tanpa aplikasi pembunuh untuk mendorong adopsi dan penerimaan, tetapi sangat sulit dan mungkin membutuhkan waktu yang sangat lama. (Perl memiliki cerita yang serupa, tetapi datang beberapa tahun sebelumnya dan sekarang memiliki lebih sedikit serapan.)
Dari sini, saya bisa mengatakan bahasa fungsional mana yang menurut saya sedang naik daun:
Jika Anda bertanya kepada saya di mana harus mencari bahasa fungsional populer berikutnya, saya akan mengatakan mencari bahasa fungsional dengan pengembangan cloud turnkey (a la Heroku atau GAE) atau pengembangan aplikasi turnkey mobile.
sumber
Untuk alasan yang sama bahwa Lisp tidak pernah benar-benar memahaminya (biarkan flamewar dimulai!). Pemrograman fungsional adalah paradigma yang sangat asing dibandingkan dengan pemrograman imperatif dan berorientasi objek. Jika, seperti sebagian besar siswa CS, Anda memulai dengan C dan berkembang ke C ++ / Java, Anda cenderung tidak ingin belajar berpikir dengan cara yang sepenuhnya ortogonal dengan cara yang biasanya Anda pikirkan.
sumber
Mari kita pertimbangkan bisnis dan pemrograman.
Ada bisnis yang menggunakan perangkat lunak mereka sebagai aset strategis. Ini bukan tipikal. Bagi sebagian besar bisnis, TI adalah sesuatu yang mendukung bisnis nyata perusahaan. Itu biaya yang diperlukan. Mereka konservatif karena mereka tahu bahwa untuk $ X mereka bisa mendapatkan IT yang mereka butuhkan, sementara jika mereka beralih ke sesuatu yang berbeda mereka akan menghemat kurang dari $ X jika semuanya berjalan dengan baik, dan kehilangan sangat besar jika semuanya berjalan buruk.
Selain itu, dalam bisnis, hal termurah yang harus dilakukan biasanya adalah apa yang mereka lakukan kemarin. Namun, perubahan yang diinginkan itu mahal. Jika sebuah perusahaan berubah dari, katakanlah, solusi C # /. NET, bahkan ke F #, mereka akan mengalami masalah. Pemrogram mereka (yang mungkin bukan pemrogram paling tajam di luar sana) harus belajar bahasa baru, dan mahir dalam keduanya, dan sering menggunakan keduanya. Akan ada rutinitas yang ditulis dalam keduanya untuk waktu yang lama. Jika mereka pindah ke sesuatu seperti Haskell, atau jika mereka menggunakan C ++ / MFC di tempat pertama, mereka akan berubah lebih banyak, dan itu akan jauh lebih mahal.
Juga, akan ada pasokan programmer C #, dan melanjutkan dukungan Microsoft, untuk waktu yang lama. Praktik TI saat ini dapat diandalkan. Tidak ada tingkat dukungan kelembagaan yang sama atau jaminan ketersediaan programmer yang berkelanjutan.
Oleh karena itu, untuk sebagian besar bisnis, membuat perubahan pada pemrograman fungsional akan mahal di muka, dan itu hanya akan membayar sendiri jika pengurangan biaya TI cukup dalam jangka panjang, kecuali bahwa jangka panjang berpotensi rapuh.
sumber
Anda sudah menulis kode dengan gaya fungsional, hanya saja Anda tidak mengetahuinya.
Ketika Anda diminta untuk membuat unit test untuk kode Anda, Anda cenderung menulis fungsi yang dapat diuji, yang tidak membuat atau bergantung pada efek samping, dan selalu mengembalikan hasil yang sama pada argumen yang sama (disebut fungsi murni). Ini adalah keunggulan utama dari program fungsional.
Saya pikir bahasa fungsional terlalu membatasi. Jadi, alih-alih mengganti bahasa imperatif dengan fungsional, bahasa imperatif akan mendapatkan fitur fungsional. Saat ini hampir setiap bahasa pemrograman memiliki penutup dan lambda.
sumber
Saya percaya hanya ada satu jawaban nyata untuk pertanyaan Anda. Anda dapat masuk ke banyak alasan terkait mengapa jawaban ini adalah masalahnya, tetapi itu adalah pertanyaan yang berbeda.
Ini dia:
Apakah ini menangkap? Itu semua tergantung pada apakah orang yang percaya diri dalam menggunakan bahasa fungsional menjadi arsitek dan memilih untuk menggunakannya untuk proyek yang mereka kerjakan.
sumber
Masalah sebenarnya adalah negara.
Bahasa fungsional tidak memiliki status global. Sebagian besar masalah industri memerlukan keadaan pada skala besar (bagaimana Anda mewakili buku besar atau set transaksi) bahkan jika beberapa fungsi dalam skala kecil tidak benar-benar memerlukannya (memproses buku besar).
Tapi kami menjalankan kode pada mesin arsitektur Von-Neuman yang secara inheren state-full. Jadi kita belum benar-benar menyingkirkan negara, bahasa fungsional hanya menyembunyikan kompleksitas negara dari pengembang. Ini berarti bahwa bahasa / kompiler harus berurusan dengan keadaan di belakang layar dan mengelolanya.
Jadi meskipun bahasa fungsional tidak memiliki status global, informasi statusnya dilewatkan sebagai parameter dan hasil.
Melihatnya dari Sisi Hardware
OS telah banyak membantu dalam beberapa tahun terakhir dalam memvisualisasikan ruang alamat sehingga aplikasi tidak perlu khawatir tentang hal itu. Tetapi aplikasi yang tidak khawatir jatuh ke dalam perangkap meronta-ronta perangkat keras ketika tekanan memori menjadi intens (perangkat keras meronta-ronta akan memperlambat proses Anda untuk merangkak).
Karena programmer tidak mengendalikan langsung keadaan dalam bahasa fungsional, mereka harus bergantung pada kompiler untuk menangani ini dan saya belum melihat bahasa fungsional yang menangani ini dengan baik.
Di sisi sebaliknya, programmer state-full memiliki kontrol langsung atas keadaan dan dengan demikian dapat mengompensasi kondisi memori rendah. Meskipun saya belum melihat banyak programmer yang sebenarnya cukup pintar untuk melakukannya.
Dilihat dari sisi industri:
Industri memiliki banyak programer penuh negara yang tidak efisien.
Tetapi mudah untuk mengukur peningkatan dalam program-program ini seiring waktu. Anda melempar tim pengembang pada masalah mereka dapat meningkatkan kode dengan meningkatkan cara program menangani keadaan.
Untuk program fungsional perbaikan lebih sulit untuk diukur karena Anda perlu meningkatkan alat yang akan meningkatkan program (kami hanya melihat bagaimana aplikasi menangani keadaan yang mendasarinya secara efisien di sini, bukan perbaikan keseluruhan program).
Jadi untuk industri, saya pikir ini berkaitan dengan kemampuan untuk mengukur peningkatan dalam kode.
Dari perspektif perekrutan
Ada banyak programmer stat-full yang tersedia untuk disewa. Pemrogram fungsional sulit ditemukan. Jadi model penawaran dan permintaan dasar Anda akan muncul jika industri beralih ke pemrograman gaya fungsional dan itu bukan sesuatu yang mereka inginkan terjadi (programmer cukup mahal seperti itu).
sumber
Pertanyaan ini memiliki premis yang sedikit salah. Karena alasan berikut:
sumber
Karena lebih sulit untuk men-debug FP.
sumber