Jebakan dunia nyata dalam memperkenalkan F # ke dalam basis kode dan tim teknik besar [ditutup]

37

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.

nganju
sumber
7
"Kelompok programmer F # yang dapat dipekerjakan [...] tidak ada" - Hampir tidak ada. Namun, jika Anda menemukan seorang programmer yang memiliki atau bersedia untuk mengkhususkan diri dalam F #, mereka cenderung sangat istimewa.
Tim Robinson
Anda meminta jebakan kehidupan nyata, tetapi termasuk jebakan potensial dalam pertanyaan Anda. Ini mengundang lebih banyak jebakan "imajiner" dalam jawaban, atau untuk jawaban di luar topik yang menyangkal jebakan yang Anda pertimbangkan. Jika saya akan downvote Anda karena masalah formulasi ini jika saya bisa (reputasi terlalu rendah)
Joh
Nick, saya akan mengatakan: pilih beberapa geek senior yang cakap yang sudah Anda miliki dan biarkan mereka bermain dengan F # dengan tujuan membuat perusahaan lebih pintar / lebih baik / lebih produktif, dan bukan hanya untuk bersenang-senang. Ada beberapa orang seperti itu di mana saya bekerja.
Ayub

Jawaban:

28

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.

MK
sumber
13

Adakah perangkap lain yang tidak saya pertimbangkan?

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.

Atau ada yang mau membantah perangkap yang saya sebutkan?

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!

Jon Harrop
sumber
3
Pernyataan tegas: bahasa yang dapat Anda pelajari bahwa cepat tidak layak ditambahkan ke campuran pengembangan bisnis. Intinya dalam F # adalah menulis kode fungsional, dan kebanyakan orang tidak akan belajar pemrograman fungsional secepat itu.
David Thornley
8
Contoh penghitung flat-out: LINQ. Menulis kode fungsional sama sekali bukan titik F #, baik dengan definisi "fungsional". Dalam konteks C # dev yang ada, mereka seharusnya sudah setengah jalan dengan System.Func.
Jon Harrop
1
Jika F # bukan terutama tentang pemrograman fungsional, lalu apa sebenarnya itu? Bagaimana Anda tahu kapan F # lebih cocok daripada, katakanlah, C #?
Robert Harvey
5
@Robert: F # menawarkan berbagai fitur yang dapat membuatnya jauh lebih produktif daripada C #. Jenis varian dan pencocokan pola sangat kuat untuk membuat dan memanipulasi pohon, yang muncul dalam segala hal mulai dari kompiler hingga grafik komputer. Ketik inferensi membuatnya mudah untuk menulis kode yang sangat umum, yang ideal untuk algoritme padat. Sesi interaktif ideal untuk kode sekali pakai, seperti memijat set data dari satu bentuk ke bentuk lain atau bahkan melakukan analisis canggih. Fitur-fitur ini hanya terkait dengan pemrograman fungsional dan semuanya bekerja dengan baik dalam kode imperatif.
Jon Harrop
8

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.

kvb
sumber
1
@ kvb, komentar saya sedikit keluar dari topik, tetapi hanya ingin berbagi bahwa meskipun biasanya ideal, dalam praktiknya banyak perusahaan tidak memiliki posisi khusus seperti yang telah Anda jelaskan dan memang mengharuskan, seperti pada contoh Anda, satu pengembang memiliki kedalaman (cukup) pengetahuan tentang SQL, HTML, Javascript, CSS, dll. dan mungkin juga analisis bisnis. Saya pribadi bekerja di bawah kedua skenario ( tidak ditentukan oleh ukuran perusahaan) dan masing-masing memiliki kelebihan dan kekurangannya dan mungkin lebih atau kurang sesuai berdasarkan per proyek, tetapi spesialisasi jelas merupakan kemewahan.
Stephen Swensen
7

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:

  1. Kesulitan saat debugging. Mengikuti alur pelaksanaan program berbasis ekspresi di debugger yang dirancang untuk bahasa berbasis pernyataan bisa rumit.

  2. Intellisense frustrasi. Penyelesaian otomatis berhenti berfungsi tepat saat Anda membutuhkannya. Microsoft harus berupaya membuat pengurai latar belakang lebih toleran terhadap kesalahan.

  3. Sintaks indentasi sensitif membuatnya sulit untuk menyalin-tempel atau memformat ulang kode.

  4. Kurangnya refactoring.

  5. 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 datang async?

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?

Joh
sumber
5

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

Darknight
sumber
15
apakah Anda akan membayar pengembang Anda untuk mengerjakan ini selama akhir pekan? Tuhan tahu saya telah menghabiskan banyak akhir pekan dan malam hari belajar F #, tetapi sebagai hobi. Meskipun benar bahwa ketika saya disadap untuk proyek Grails, saya belajar sendiri kerangka itu sebagian saat libur, tetapi itu hanya kepribadian saya dan saya menikmatinya, tetapi jika ada orang yang mengatakan kepada saya untuk melakukannya selama waktu libur, saya akan tidak bahagia.
Stephen Swensen
+1 tetapi: Haskell dan Lisp adalah murni kepentingan akademik. Saya tidak berpikir itu akan menambah nilai bagi programmer. NET bagi mereka untuk belajar bahasa-bahasa tersebut Saya pikir (sebagai penulis beberapa buku F # ;-) bahwa membaca buku yang bagus akan lebih produktif daripada mencoba menulis kode F # (seperti teka-teki proyek Euler) di vacuo. Dengan panduan, mereka dapat mencapai kecepatan dalam satu bulan.
Jon Harrop
4

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.

gradbot
sumber
Jika seseorang sudah mengetahui platform C # dan .Net, mempelajari F # biasanya harganya kurang dari satu bulan. (berdasarkan pengalaman dari dua rekan kerja saya.)
4

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.

Rei Miyasaka
sumber
1
Jika £ 39 adalah "uang besar" untuk melatih pengembang, maka mempelajari F # adalah kekhawatiran Anda yang paling sedikit, IMHO.
Jon Harrop
Uh oh, pria itu sendiri. Kawan, kau ada di mana-mana, bukan? £ 39 sebenarnya adalah uang yang sangat besar untuk jenis informasi yang pada zaman sekarang ini hampir selalu tersedia di blog atau tulisan teknis.
Rei Miyasaka
2
Semua informasi yang sangat relevan, saya tidak yakin mengapa orang memberikan suara Anda pada posting Anda. Sebanyak yang saya suka F #, pertanyaannya ada hubungannya dengan sisi negatifnya, dan posting yang menunjukkan ini seharusnya tidak dipilih oleh F # -lovers.
Joh
1

Masalah utama adalah selalu rawatan.

Saya ingin kode dalam Skema, tetapi pemelihara berikutnya mungkin ingin memburu saya dan menyiksaku.

leppie
sumber
Bagaimana jika pengelola berikutnya juga mengetahui Skema? Saya telah membaca di comp.lang.lisp bahwa jaringan programmer Lisp untuk tujuan dapat memberikan penggantian kepada majikan mereka jika diperlukan.
Larry Coleman
0

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.

Nemanja Trifunovic
sumber