Ada banyak argumen "teoretis" tentang mengapa pemrograman fungsional adalah ide yang bagus (terlalu banyak untuk itu tetap menjadi pertanyaan terbuka, dan memang benar demikian).
Namun, kebanyakan dari mereka adalah argumen yang dibuat dari teori ("keanggunan", dll ...), atau, yang ditujukan untuk pengembang.
Masalahnya adalah, kebanyakan dari mereka sama sekali tidak berguna ketika tujuan seseorang adalah untuk mempresentasikan ide tersebut kepada manajemen senior sebuah perusahaan besar , beberapa di antaranya bahkan bukan pengembang, dan semuanya kebanyakan peduli dengan argumen bisnis : biaya, manajemen sumber daya manusia , pengiriman produk, layanan klien dan pendapatan; serta fakta-fakta kuantitatif atas poin-poin teoretis yang tidak dapat didukung dengan fakta.
Adakah argumen kuat untuk diajukan untuk mengatasi masalah bisnis tersebut sejauh mempertimbangkan adopsi pemrograman fungsional sebagai konsep (bukan bahasa spesifik), vs. campuran khas prosedural / OOP, misalnya Java / C ++ / (Perl | Python) .
Lebih disukai, saya mencari argumen yang kuantitatif dan / atau berdasarkan penelitian atau studi kasus. Misalnya "menurut referensi ini, tingkat bug sistem multithreaded di Lisp / F # adalah 10% dari Jawa" atau "80% lulusan top yang mengekspresikan preferensi teknologi yang diinginkan bernama pemrograman fungsional sebagai atas 3 minat utama".
Saya tahu bahwa Graham mempresentasikan kasus penggunaan pemrograman fungsional untuk starup dan akan terbuka untuk beberapa argumennya dengan asumsi mereka dapat valid untuk perusahaan mapan yang lebih besar.
psI saya sangat menyadari bahwa Anda dapat melakukan sesuatu yang dekat dengan pemrograman fungsional dalam Perl, kemungkinan Python, dan (mungkin) bahkan Java 8 atau C ++ 14. Tetapi itu tidak berarti bahwa organisasi yang menggunakan Perl, C ++ atau Java akan mendukung fungsional vs OOP / pendekatan prosedural bahkan dalam bahasa-bahasa tersebut
Untuk keperluan bahasa ini, "besar" didefinisikan sebagai cukup besar untuk memiliki kelompok teknik / alat pengembangan khusus, yang menentukan apa yang semua pengembang boleh gunakan / lakukan; dan setidaknya ratusan pengembang di kelas bawah .
Jawaban:
Ada satu argumen yang sangat sederhana, yang setidaknya bisa menghibur manajemen.
Sudah diketahui bahwa komputer modern tidak menjadi "lebih cepat" seperti dulu, karena penskalaan frekuensi, untuk saat ini, mencapai batasnya. Mereka meningkatkan potensi produktivitas mereka dengan menambahkan core.
Ini menyiratkan bahwa untuk mendapatkan manfaat paling banyak dari arsitektur ini, program harus diparalelkan. Tetapi pemrograman paralel jauh lebih sulit daripada pemrograman berurutan, karena banyak tantangan baru yang dibawanya (lihat artikel Wiki untuk tinjauan komprehensif).
Pemrograman fungsional membantu untuk menyingkirkan beberapa tantangan ini, misalnya kondisi balapan tidak berlaku jika Anda hanya menggunakan variabel dan metode yang tidak dapat diubah tanpa efek samping. Kurva belajar untuk pemrograman fungsional seringkali curam, tetapi kurva belajar untuk pemrograman paralel mungkin lebih curam, dan sama sekali tidak intuitif.
Jadi, jika tantangannya adalah untuk menulis program yang lebih efisien dengan cara yang lebih efisien, orang dapat membandingkan biaya pelatihan orang untuk menulis program paralel dengan biaya pelatihan orang untuk belajar pemrograman fungsional, dan risiko yang mungkin ditimbulkan oleh kedua pendekatan tersebut.
Mengenai bahasa campuran (yang mendukung gaya pemrograman fungsional dan imperatif): dari satu titik, mereka mungkin berguna untuk transisi (orang mungkin mulai menggunakannya dengan cara "akrab" dan secara bertahap mempelajari pendekatan baru). Dari titik lain, ini mungkin menjadi berkah tersembunyi, karena potensi keuntungan yang dibawa oleh pemrograman fungsional mungkin dibatalkan dengan kode seseorang yang canggung. Seseorang dapat mengurangi ini dengan membuat pedoman pengkodean yang jelas (lihat misalnya " Scala Efektif " oleh Twitter), meskipun mengikuti pedoman tersebut membutuhkan tingkat kematangan tim tertentu. Dari sudut pandang ini, bahasa fungsional murni mungkin "lebih mudah" untuk pengembangan perangkat lunak karena aturan yang lebih ketat yang diterapkan oleh desain.
sumber
Anda mendekati ini dari sisi yang salah. Di sebagian besar perusahaan, manajemen tidak bertanggung jawab untuk "memilih paradigma pemrograman", mereka (atau setidaknya harus) bertanggung jawab untuk membuat tim bekerja secara efisien. Jika seluruh tim Anda yakin pemrograman fungsional akan meningkatkan kecepatan atau kualitas pekerjaan Anda, seharusnya tidak terlalu sulit untuk meyakinkan manajemen juga. Selain itu, jika tim Anda baru saja mulai menggunakan konstruksi fungsional dalam bahasa pemrograman Anda yang sudah mapan, dan semua orang senang dengan itu, Anda bahkan tidak perlu meminta izin (huh, non-programmer bahkan mungkin tidak memahami perbedaan antara non-programmer). konstruksi fungsional dan fungsional, jadi mengapa Anda ingin membahas masalah itu dengannya?).
Tetapi berhati-hatilah, jika anggota tim Anda yang lain memiliki pendapat yang berbeda tentang FP, dan mereka mulai mengeluh tentang kode fungsional Anda yang anggota tim lainnya tidak mengerti, Anda mungkin mengalami masalah dengan manajemen - untuk alasan yang baik, karena dalam suatu kasus, tim kehilangan efisiensi.
Jadi intinya adalah: meyakinkan anggota tim lain, atau pemimpin tim Anda, tetapi, bukan manajemen tingkat tinggi!
EDIT: karena komentar Anda - sebenarnya, ini adalah jawaban untuk pertanyaan Anda ;-). Satu argumen faktual yang saya bicarakan adalah "seluruh tim berpikir FP bermanfaat untuk melakukan pekerjaan itu . IMHO itulah argumen dengan peluang tertinggi untuk diterima oleh manajemen tingkat tinggi, dan ini sangat praktis dapat diterapkan. Mencoba menggunakan argumen teknis untuk orang-orang non-teknis secara langsung jarang bekerja, bukan karena mereka "terlalu bodoh untuk memahami alasan teknis", tetapi karena mereka cukup pintar untuk mengetahui bahwa keputusan teknis harus dibuat oleh para ahli teknis, dan mereka juga cukup pintar untuk tidak mengandalkan menurut pendapat hanya satu ahli.
sumber
Untuk memahami mengapa Pemrograman Fungsional tidak mengambil alih dunia, Anda harus memahami pemikiran perusahaan di balik keputusan bahasa pemrograman. Untuk memilih Java sebentar:
Jika organisasi Anda sudah bercokol di Kingdom of Nouns , membuat perubahan besar untuk Pemrograman Fungsional tidak akan terjadi. Pilihan bahasa (dan semua pilihan lain yang mengelilinginya) sudah sangat tertanam dalam budaya perusahaan.
Dengan asumsi tujuan Anda adalah untuk tumbuh sebagai pengembang perangkat lunak, taruhan terbaik Anda adalah untuk
Argumen Paul Graham benar-benar hanya berlaku untuk startup, dan ada sejumlah kisah peringatan tentang perusahaan yang awalnya menggunakan bahasa Fungsional murni, tetapi kemudian dibeli oleh perusahaan lain yang pesanan bisnis pertamanya adalah segera mengubah basis kode fungsional ke bahasa OO sehingga pengembang perangkat lunak yang ada bisa memahaminya.
sumber
Dalam pengalaman saya (agak sinis), pernah bekerja di toko tempat kami menggunakan pemrograman fungsional, dan mewawancarai beberapa orang lain:
sumber
Hal-hal yang perlu dipertimbangkan untuk manajemen tingkat atas ketika / jika manajemen tingkat atas terlibat dalam memilih bahasa pemrograman (yang aneh, mereka harus menyerahkannya kepada orang-orang yang dapat dipercaya dan berpengetahuan (baik teknologi dan cerdas bisnis):
Perhatikan bahwa ini tidak spesifik untuk bahasa pemrograman fungsional. Ini juga bukan argumen kecuali Anda memberikan data ini. Kami tidak dapat memberi Anda data karena sepenuhnya bergantung pada lingkungan bisnis Anda. Satu-satunya hal yang bisa kami lakukan adalah mengumpulkan data dari web untuk menunjukkan seberapa banyak pengetahuan dan minat untuk bahasa tertentu. Hati-hati saat menerjemahkan banyak pertanyaan di StackOverflow atau banyak tag di Linkedin ke dalam bahasa yang sedang populer.
sumber
Saya pikir argumen atau fakta tidak akan membantu. Dan tentu saja bukan tanpa menyatakan masalah yang ingin Anda pecahkan.
Terhadap kepercayaan umum dan evaluasi diri yang khas, banyak keputusan dibuat berdasarkan firasat. Dan seringkali keputusan ini adalah keputusan yang sangat baik, karena mereka menggabungkan pada tingkat bawah sadar banyak pengalaman dari individu yang membuat keputusan.
Jika Anda ingin menentang keputusan seperti "Kami akan tetap menggunakan bahasa seperti C sampai akhir semua komputer" Anda harus melakukan lebih dari sekadar memberikan beberapa argumen.
Langkah pertama mungkin untuk mengungkap orang dan alasan di balik keputusan bahwa manajemen senior harus mengatakan dalam keputusan teknis tersebut. Tentu saja saya hanya bisa menebak di sini, tetapi sangat mungkin mereka memiliki rekam jejak keputusan yang dibuat oleh pribadi teknis yang buruk. Mari kita hadapi: Kebanyakan pengembang tidak pandai membuat keputusan (bahkan teknis) di tingkat perusahaan.
Setelah Anda menemukan orang-orang ini berbicara kepada mereka untuk mendapatkan kepercayaan di sana. Mungkin pendekatan terbaik adalah: dengarkan mereka. Apa yang mereka khawatirkan, apa risiko dan peluang yang mereka lihat. Masalah apa yang mereka hadapi. Dari sini Anda mungkin bergerak untuk melibatkan orang-orang teknologi ke dalam keputusan semacam ini. Manajemen sering kali tidak benar-benar ingin membuat keputusan ini, tetapi tidak memercayai orang lain dengannya. Jadi, jika tim Anda mulai terlibat dalam keputusan arsitektur dan menunjukkan bahwa keputusan yang Anda usulkan adalah manajemen yang baik mungkin bersedia mempercayai Anda / tim Anda.
Penting untuk menghasilkan keputusan arsitektur yang baik adalah:
Jika Anda bekerja untuk perusahaan besar dengan karyawan 10K + katakan, bersiaplah untuk belajar beberapa pelajaran berikut.
Setelah Anda mencapai tingkat kepercayaan bahwa argumen Anda didengar dan dipertimbangkan, Anda juga akan membentuk cara untuk mengumpulkan dan mempertimbangkan persyaratan yang Anda, tim, dan manajemen percayai.
Jika proses ini menghasilkan rekomendasi untuk menggunakan pendekatan fungsional di bidang-bidang tertentu Anda selesai.
Jika proses ini menghasilkan rekomendasi untuk mengabaikan pendekatan fungsional yang melampaui apa yang ditawarkan oleh bahasa pemrograman utama saat ini, Anda juga telah selesai.
Berita buruknya adalah: Bergantung pada ukuran dan gaya perusahaan, ini mungkin dengan mudah memakan waktu beberapa tahun atau beberapa dekade.
Berita baiknya adalah: Anda akan belajar banyak di jalan.
Karena langkah pertama adalah mulai berbicara dan terutama mendengarkan manajemen senior, saya sarankan mulai dengan membaca Just Listen .
sumber
Salah satu pendekatan yang baik adalah menunjukkan bahwa itu menunjukkan hasil yang baik di industri dan diadopsi.
Anda bisa mendapatkan beberapa data dari:
http://www.quora.com/What-companies-use-a-functional-language-as-an-official-language
http://pchristensen.com/blog/lisp-companies/
Idealnya, cobalah berbicara dengan para manajer di beberapa perusahaan terbuka, terutama jika di industri Anda, dan dapatkan angka dan testimonial dari mereka.
Google memiliki banyak tautan serupa lainnya untuk Haskell, OCaml, dll.
sumber
Anda datang pada ini dari arah yang salah.
Anda sedang mencoba meyakinkan manajemen untuk beralih ke paradigma fungsional untuk hiburan Anda sendiri dan Anda sedang mencoba menyuarakan argumen untuk mendukung ini yang tidak ada hubungannya dengan alasan sebenarnya mengapa Anda menginginkannya. Kalau tidak, Anda tidak perlu mengajukan pertanyaan, karena Anda dapat membuat daftar argumen dari atas kepala Anda.
Sebaliknya, apa yang harus Anda pikirkan adalah apa yang dibutuhkan oleh bisnis saat ini dan bagaimana hal itu dilayani dengan sebaik-baiknya. Jika itu terjadi maka sebaiknya disajikan menggunakan paradigma fungsional maka - yay! - kamu bisa bermain. Tetapi jika Anda melakukan analisis yang adil, dengan mempertimbangkan kebutuhan bisnis operasional, pelatihan yang diperlukan dari rekan kerja, latar belakang programmer masa depan, pemeliharaan, dan sebagainya, sering kali tidak.
sumber
Manajemen senior tanpa keterampilan teknis seharusnya tidak memedulikan aspek teknis seperti penggunaan paradigma fungsional. Ini bukan bidang keahlian mereka, dan mencium manajemen mikro. Mengapa mereka tidak mendelegasikan keputusan itu kepada orang-orang yang sebenarnya memiliki keterampilan yang dibutuhkan?
Makhluk ini dikatakan, berikut adalah beberapa petunjuk untuk meyakinkan orang-orang dengan latar belakang teknis (kasus pertama) dan mereka yang tidak memiliki satu (kasus kedua).
Kasus pertama
Jika Anda berbicara dengan orang yang tahu pemrograman , membandingkan kode yang ditulis tanpa paradigma pemrograman fungsional dan kode yang sama yang ditulis dengan gaya fungsional mungkin cukup meyakinkan:
Contoh kode C # yang menggunakan gaya imperatif:
Kode yang sama ditulis ulang dengan pemrograman fungsional dalam pikiran:
Kemudian tanyakan pada mereka:
Berapa banyak kesalahan yang bisa dilakukan seorang programmer dalam sampel pertama? Bagaimana dengan yang kedua?
Seberapa sulitkah untuk menemukan kesalahan?
Seberapa sulitkah untuk memodifikasi kode?
Ketiga faktor tersebut mempengaruhi produktivitas, dan juga biaya produk.
Kasus kedua
Jika Anda berurusan dengan orang-orang yang tidak tahu pemrograman, tidak ada banyak hal teknis yang bisa Anda sampaikan kepada mereka. Salah satu cara untuk meyakinkan adalah untuk menunjukkan dampak aktual dari paradigma fungsional pada pekerjaan Anda dan pekerjaan rekan kerja Anda.
Misalnya, bandingkan dua proyek yang dibuat oleh tim yang sama, satu menggunakan FP, yang lain tidak menggunakannya. Menunjukkan bahwa jumlah bug jauh lebih rendah atau ini adalah proyek pertama yang sebenarnya dikirimkan perusahaan tepat waktu harus cukup meyakinkan.
sumber
yield
return
sedikit curang, ini menjadi contoh bagaimana Anda akan menyiapkan kode untuk digunakan dalam skenario Linq, danif
pernyataan Anda dapat ditulis lebih ringkas dengan operator ternary. Semua contoh pertama Anda dapat di refactored menjadi fungsi imperatif, sehingga kompleksitasnya tersembunyi.map
/grep
sebagai non-FP. TKI, Anda mengajukan argumen bahwa Java adalah bahasa yang buruk, bukan bahwa FP adalah pendekatan yang baik.