Saya CTO dari perusahaan perangkat lunak dengan basis kode besar yang sudah ada (semua C #) dan tim teknik yang cukup besar. Saya dapat melihat bagaimana bagian-bagian tertentu dari kode akan jauh lebih mudah untuk ditulis dalam F #, menghasilkan waktu pengembangan yang lebih cepat, lebih sedikit bug, implementasi paralel yang lebih mudah, dll., Pada dasarnya keuntungan produktivitas keseluruhan untuk tim saya. Namun, saya juga dapat melihat beberapa jebakan produktivitas memperkenalkan F #, yaitu:
1) Setiap orang harus belajar F #, dan tidak sepele seperti beralih dari, katakanlah, Java ke C #. Anggota tim yang belum mempelajari F # tidak akan dapat bekerja pada bagian F # dari basis kode.
2) Kelompok programmer F # yang dapat disewa, seperti yang sekarang (Des 2010) tidak ada. Cari berbagai database resume insinyur perangkat lunak untuk "F #", cara kurang dari 1% dari resume berisi kata kunci.
3) Dukungan masyarakat sampai sekarang (Des 2010) kurang tersedia. Anda dapat google hampir semua masalah di C # dan menemukan seseorang yang sudah mengatasinya, tidak demikian dengan F #. Dukungan alat pihak ketiga (NUnit, Resharper dll) juga tidak lengkap.
Saya menyadari bahwa ini sedikit Catch-22, yaitu jika orang seperti saya tidak menggunakan F # maka komunitas dan alat tidak akan pernah terwujud, dll. Tapi, saya punya perusahaan yang harus dijalankan, dan saya bisa menjadi yang terdepan tetapi tidak berdarah tepi.
Adakah perangkap lain yang tidak saya pertimbangkan? Atau ada yang mau membantah perangkap yang saya sebutkan? Saya pikir ini adalah diskusi yang penting dan akan senang mendengar kontra-argumen Anda di forum publik ini yang dapat melakukan banyak hal untuk meningkatkan adopsi F # oleh industri.
Jawaban:
Pencarian resume untuk bahasa fungsional lainnya seperti Skema, Lisp atau Haskell. Banyak orang mempelajarinya di sekolah dan menuliskannya di resume mereka; Saya yakin banyak dari mereka yang tidak keberatan belajar F #. Saya memiliki Skema dalam resume saya meskipun saya tidak pernah menggunakannya setelah sekolah dan pekerjaan yang melibatkan F # mungkin akan mendapatkan perhatian saya juga.
sumber
Dalam praktiknya, kesalahan utama yang saya lihat orang lakukan adalah mencoba memaksa penggunaan F # untuk masalah di mana itu adalah alat yang salah untuk pekerjaan itu.
Mereka semua jelas merupakan keprihatinan yang sah sampai taraf tertentu, tetapi saya akan mempertanyakan sampai sejauh mana.
Misalnya, Anda mengatakan bahwa setiap orang harus mempelajari F # untuk dapat bekerja pada kode F #. Meskipun benar, ini bukan masalah besar dalam praktik. Belajar F # tidak lebih penting daripada belajar WPF, Silverlight atau TPL. Saya mengajar sekitar 30 pengembang cara menggunakan F # untuk klien di London sekarang dan sekitar selusin bekerja penuh waktu pada kode F # setelah hanya beberapa minggu dan mereka baru saja mengirimkan produk pertama mereka (tepat waktu dan sesuai anggaran! ) ditulis hampir seluruhnya dalam F # setelah hanya beberapa bulan. Pada kenyataannya, mereka memiliki lebih banyak kesulitan teknis dengan Silverlight daripada F # dan mereka menemukan dukungan teknis untuk Silverlight jauh lebih buruk daripada untuk F #.
Anda merujuk pada kumpulan yang relatif kecil dari programmer F # yang tersedia tetapi, sekali lagi, mengingat betapa mudahnya untuk mengambil F # Saya tidak berpikir ini adalah masalah yang signifikan. Saya ragu Anda harus mempekerjakan banyak orang, jika ada. Klien saya memiliki dua orang F # untuk lebih dari 100 programmer dan tugas kami adalah menyemai dan mengawasi penggunaan F #.
Kekhawatiran ketiga dan terakhir Anda mengenai dukungan komunitas yang lebih sedikit, solusi Googling untuk C # vs. Sekali lagi, saya belum menemukan ini bermasalah dalam praktek. Saya mengirim e-mail kepada fsbugs dengan komentar tentang satuan ukuran dalam F # dan mendapat tanggapan dalam waktu 24 jam dari peneliti yang menciptakannya dengan penjelasan terperinci tentang mengapa interpretasi saya salah dan mengapa ia bekerja seperti itu. Saya tidak pernah mendapatkannya dari Anders Hejlsberg ;-). Saya Google untuk solusi sepanjang waktu dan menemukan mereka ditulis dalam C #, VB atau bahkan IronPython tetapi, dalam 3 tahun menggunakan industri F #, hanya dapat mengingat satu contoh tunggal di mana menerjemahkan solusi ke F # itu tidak sepele. Sebenarnya, saya baru-baru ini mengkonversi data serializer C # sampel dari MSDN ke F # dan itu 5x lebih pendek. Akhirnya, Anda menyebutkan dukungan F # dalam alat-alat seperti NUnit ketika kami telah menggunakan NUnit dari F # tanpa masalah selama beberapa waktu. Ini adalah alat .NET, bukan alat C #.
Studi kasus : Klien saya saat ini tidak hanya menggunakan NUnit untuk pengujian unit tetapi mereka membangun TickSpec di F # di atas NUnit sebagai alternatif yang unggul secara teknis dari SpecFlow untuk BDD. Penulis membuat titik untuk menunjukkan kepada saya bahwa TickSpec adalah sebagian kecil dari ukuran SpecFlow dan menyediakan lebih banyak fitur. Selain itu, beberapa pengembang di tempat kerja tanpa pengalaman F # sebelumnya (dan, saya percaya, tidak ada pengalaman pemrograman fungsional sebelumnya) telah mengambilnya dan mulai menggunakannya dalam proyek yang tidak terkait tanpa masalah justru karena F # + TickSpec membuatnya lebih mudah untuk menyelesaikannya masalah.
FWIW, saya memberi klien saya langganan situs gratis untuk F # .NET Journal kami yang turun dengan baik dengan banyak pengembang yang mempelajari F #.
HTH!
sumber
System.Func
.Seperti yang Anda kenali pada poin pertama Anda, programmer Anda yang tidak tahu F # tidak dapat bekerja pada bagian F # dari basis kode Anda. Namun, Anda tidak perlu menulis ulang seluruh basis kode dalam F # untuk mendapatkan keuntungan dari menggunakannya - cukup tulis ulang bagian-bagian di mana Anda akan melihat manfaat terbesar. Fakta bahwa F # berinteroperasi sangat baik dengan C # harus membuatnya relatif mudah untuk mengukir bagian-bagian tertentu dan membuat rakitan F # dari mereka.
Jika Anda memiliki insinyur Anda bekerja pada aplikasi 3-tier tradisional, Anda mungkin tidak akan bersikeras bahwa mereka semua perlu memiliki pengetahuan yang mendalam tentang SQL, HTML, Javascript, CSS, dll. Sebaliknya, Anda tentu saja memiliki beberapa spesialis yang bekerja pada berbagai bagian aplikasi. Oleh karena itu, saya tidak berpikir bahwa menambahkan bahasa baru untuk satu bagian dari aplikasi Anda harus terlalu besar. Selain itu, Anda dapat menggunakan standar pengkodean dan praktik lain untuk memastikan bahwa kode F # Anda dapat dibaca bahkan oleh para insinyur tanpa latar belakang F # yang mendalam.
sumber
Perangkap menambahkan F # ke bahasa yang Anda gunakan termasuk perangkap memperkenalkan teknologi baru. Terlepas dari manfaatnya, jika beberapa tim Anda tidak mau atau tidak cukup fleksibel untuk belajar, mereka tidak akan dapat bekerja pada proyek F #. Namun demikian, jika Anda membiarkan dinosaurus di tim Anda mencegah adopsi teknologi baru Anda, perusahaan Anda akan hancur.
Satu-satunya jebakan yang saya alami secara pribadi adalah:
Kesulitan saat debugging. Mengikuti alur pelaksanaan program berbasis ekspresi di debugger yang dirancang untuk bahasa berbasis pernyataan bisa rumit.
Intellisense frustrasi. Penyelesaian otomatis berhenti berfungsi tepat saat Anda membutuhkannya. Microsoft harus berupaya membuat pengurai latar belakang lebih toleran terhadap kesalahan.
Sintaks indentasi sensitif membuatnya sulit untuk menyalin-tempel atau memformat ulang kode.
Kurangnya refactoring.
Beberapa ekstensi VS nyaman yang ada untuk F # (kode lipat, pewarnaan mendalam) agak lambat, membuat pengalaman mengetik agak frustasi.
Menurut pendapat saya, tidak satu pun dari masalah ini adalah penghentian pertunjukan, dan saya dapat hidup dengan mereka untuk saat ini. Alat lebih mudah ditingkatkan dan diperbaiki daripada bahasa.
Ketakutan Anda bahwa merekrut programmer baru yang mampu menulis dalam F # akan sulit, tetapi menurut pendapat saya tidak masuk akal. Jika Anda menulis pedoman pengkodean, apakah Anda akan menyarankan atau melarang salah satu fitur berikut dalam C #
yield return
:, LINQ ke objek, lambdas, yang akan datangasync
?Jika Anda yakin fitur ini membantu menulis kode yang lebih baik, maka tidak ada alasan untuk menahan diri dari F #. Bahasa ini mendukung fitur-fitur ini dengan cara yang halus dan dipikirkan dengan matang, yang C # tidak dapat lakukan karena warisannya.
Jika tim Anda cukup pintar untuk memahami konsep di balik fitur yang saya sebutkan, mereka memiliki semua yang mereka butuhkan untuk menjadi programmer yang sangat baik di F #. Hal yang sama berlaku untuk rekrutmen masa depan: Apakah Anda akan mempekerjakan orang yang tidak mampu atau tidak mau menggunakan fitur yang diperkenalkan setelah C # 1.0?
sumber
Saya telah merenungkan situasi yang tepat ini.
Inilah yang saya rencanakan untuk tim saya:
Campur C # dengan F #, ini bisa dilakukan dengan menggunakan C # untuk sebagian besar basis kode. Di mana pemrosesan data yang berat diperlukan, tulis fungsi terkait di F # dan letakkan di dalam dll, atau rujuk. Contoh di sini
Perlahan ulang faktor basis kode Anda yang ada dengan cara di atas.
Tidak semua kode harus berfungsi.
Dapatkan tim Anda untuk mempelajari dasar - dasar Haskell, LISP selama akhir pekan .
Buat mereka belajar F #, dengan mencoba memecahkan teka-teki Euler Project (yang banyak membantu saya ketika saya belajar F #). Sekali lagi ini harus dilakukan sesuatu selama akhir minggu, atau selama waktu kerja jika Anda ingin menyisihkan satu hari untuk "pelatihan".
sumber
1) Mempelajari bahasa fungsional akan meningkatkan kemampuan seseorang secara keseluruhan sebagai programmer namun ini hanya berlaku bagi mereka yang ingin belajar dan meningkatkan. Tidak setiap programmer ingin menjadi lebih baik dan mereka juga tidak ingin perubahan di lingkungan kerja mereka (kenal tim Anda.)
2) Saya tidak bisa berdebat dengan ini. Anda harus membayar untuk kurva belajar 6 bulan dari bahasa baru apa pun, tetapi sudah mengetahui .net library menghilangkan tahun tambahan yang diperlukan untuk mempelajari perpustakaan baru.
3) Dukungan komunitas sementara lebih kecil dari C # memiliki beberapa pengembang F # aktif yang sangat terampil memposting di web. Jangan lupa bahwa sebagian besar dukungan bahasa adalah dukungan perpustakaan dan ada dukungan hebat untuk .NET.
Gorila seribu pound di sini adalah manajemen risiko. "Aku bisa menjadi ujung tombak tetapi tidak ujung yang berdarah." Saya berpendapat bahwa F # tidak berdarah. Telah dirilis dengan VS2010 dan secara langsung didukung oleh Microsoft. Bleeding edge adalah "beta" dan penafian dari Microsoft mengatakan sesuatu tentang tidak bertanggung jawab atas apa pun.
sumber
Secara praktis, dukungan IntelliSense sangat kurang - hingga titik di mana keuntungan produktivitas dari inferensi tipe dikalahkan oleh autocomplete yang kurang canggih yang tersedia di C #.
Pesan kesalahan yang disebabkan oleh inferensi tipe yang salah juga membutuhkan waktu lebih lama untuk diperbaiki untuk pemula (dan seringkali untuk pengguna perantara seperti saya), hanya karena Anda kurang cenderung memberikan anotasi jenis daripada Anda akan menggunakan bahasa seperti C #.
OOP juga kurang mengejutkan dalam F #; misalnya, tidak ada dukungan untuk tipe / kelas bersarang. Anda harus berhati-hati ketika memasukkan kode, karena ada beberapa hal yang dapat Anda lakukan di C # yang tidak dapat Anda lakukan di F #, sayangnya.
Terakhir namun tidak kalah penting, baik ukuran dan kualitas komunitas F # agak mengecewakan. Banyak informasi F # di luar sana di web baik untuk versi lama atau tidak terlalu bagus - baik un-idiomatik, kinerja buruk atau tidak benar. Lalu ada orang-orang yang membebankan biaya sangat besar untuk buletin yang sebagian besar hanyalah informasi yang ada.
Saya sendiri menggunakan C # untuk proyek kerja dan F # untuk barang-barang saya sendiri. Sebanyak saya suka F #, sayangnya, agak sulit untuk memprediksi bagaimana / kapan hal-hal akan berantakan.
sumber
Masalah utama adalah selalu rawatan.
Saya ingin kode dalam Skema, tetapi pemelihara berikutnya mungkin ingin memburu saya dan menyiksaku.
sumber
Saya akan mengatakan hal pertama yang perlu Anda lakukan adalah bertanya kepada anggota tim Anda bagaimana perasaan mereka tentang memperkenalkan F #. Jika mereka menyukai gagasan itu, semuanya akan menjadi lebih lancar jika tidak.
sumber