F # 'yi büyük bir kod temeli ve mühendislik ekibine dahil etmenin gerçek dünya tuzakları [kapalı]


37

Var olan büyük bir kod temeli (tümü C #) ve oldukça büyük bir mühendislik ekibine sahip bir yazılım şirketinin CTO'su. Kodun belirli kısımlarının F # 'da yazmanın ne kadar kolay olacağını görebiliyorum, bu da daha hızlı geliştirme süresi, daha az hata, daha kolay paralel uygulamalar vb. Bununla birlikte, F # 'yı tanıtmanın birkaç verimlilik tuzağını da görebiliyorum, yani:

1) Herkes F # 'yı öğrenmek zorundadır ve Java'dan C #' ya geçmek kadar önemsiz değildir. F # öğrenmemiş takım üyeleri, kod tabanının F # kısımlarında çalışamazlar.

2) Şu an itibariyle (Aralık 2010) itibariyle işe alınabilen F # programcı havuzu mevcut değildir. Çeşitli yazılım mühendisi özgeçmiş veritabanlarını araştırmak için "F #", özgeçmişlerin% 1'inden daha az anahtar kelime içermesi.

3) Şu an itibariyle Topluluk desteği (Aralık 2010) daha az mevcuttur. Hemen hemen herhangi bir sorunu google'da C # ile çözebilir ve F # ile değil, zaten onunla ilgilenen birini bulabilirsiniz. Üçüncü taraf araç desteği (NUnit, Resharper vb.) De kabataslaktır.

Bunun biraz Catch-22 olduğunu anlıyorum, yani eğer benim gibi insanlar F # kullanmazlarsa o zaman topluluk ve araçlar asla gerçekleşmeyecek vs. kanama kenarı değil.

Düşünmediğim başka tuzaklar var mı? Ya da bahsettiğim tuzakları reddetmek isteyen var mı? Bunun önemli bir tartışma olduğunu düşünüyorum ve bu kamu forumundaki karşı tartışmalarınızı duymak isterim, bu da F # endüstrisinin benimsemesini arttırmak için çok şey yapabilir.


7
"Çalışılabilir F # programcıların havuzu [...] mevcut değil" - Neredeyse yok. Bununla birlikte, F # konusunda uzmanlaşmak isteyen ya da yapmak isteyen bir programcı bulursanız, oldukça özel olmaları muhtemeldir.
Tim Robinson,

Gerçek hayattaki tuzakları soruyorsunuz, ancak sorunuza potansiyel tuzakları dahil ediyorsunuz. Bu, cevaplarda daha "hayali" tuzaklar ya da düşündüğünüz tuzakları reddeden konu dışı cevaplar için davet ediyor. Yapabilirsem, bu formülasyon probleminden dolayı oyunuzu düşürürsem (itibar çok düşük)
Joh

Nick, şunu söyleyebilirim: Sahip olduğun bazı kıdemli, yetenekli dil meraklılarını seç ve F # ile oynamasına izin ver, şirketi daha eğlenceli / daha verimli / daha üretken yapmak ve sadece eğlence için değil. Çalıştığım yerde bunun gibi iki adam var.
İş

Yanıtlar:


28

Scheme, Lisp veya Haskell gibi diğer fonksiyonel dilleri arayın. Pek çok insan bunu okulda öğrenir ve özgeçmişlerinde bulundurur; Birçoğunun F # öğrenmeye aldırış etmediğinden eminim. Okuldan sonra hiç kullanmamış olmama rağmen Özgeçmişimde Program var ve F # ile ilgili bir iş de dikkatimi çekerdi.


13

Düşünmediğim başka tuzaklar var mı?

Uygulamada, insanların yaptığı ana hata, iş için yanlış bir araç olduğu problemler için F # kullanımını zorlamaya çalışmaktır.

Ya da bahsettiğim tuzakları reddetmek isteyen var mı?

Hepsi açıkça belli bir dereceye kadar geçerli kaygılar ama ne derecede sorgulayacağım.

Örneğin, F # kodu üzerinde çalışmak için herkesin F # öğrenmesi gerektiğini söylüyorsunuz. Doğru olmasına rağmen, pratikte bu büyük bir olay değil. F # öğrenmek, WPF, Silverlight veya TPL öğrenmekten daha önemli değildir. Şu anda Londra'daki bir müşteri için F # 'nın nasıl kullanılacağını 30 geliştiriciye öğretiyorum ve yaklaşık bir düzine birkaç hafta sonra F # kodunda tam gün çalışıyorlardı ve ilk ürünlerini (zamanında ve bütçe dahilinde) gönderiyorlardı! ) sadece birkaç ay sonra neredeyse tamamen F # ile yazılmış. Aslında Silverlight ile F # 'dan daha fazla teknik güçlük çekiyorlardı ve Silverlight için teknik desteğin F #' dan çok daha kötü olduğunu gördüler.

Mevcut F # programcılarının nispeten küçük havuzuna atıfta bulunuyorsunuz, ancak yine de, F # almanın ne kadar kolay olduğu göz önüne alındığında, bunun önemli bir endişe olduğunu düşünmüyorum. Varsa, birçoğunu işe almanız gerekeceğinden şüpheliyim. Müvekkilimin 100'den fazla programcı için iki F # adamı var ve bizim işimiz F # kullanımını tohumlamak ve denetlemek.

Üçüncü ve son kaygınız, daha az topluluk desteği, C # çözümleri için Googling ve F # ve üçüncü taraf araç desteği ile ilgilidir. Yine bunları pratikte sorunlu bulmadım. Fsbugs'a F # 'daki ölçü birimleri hakkında bir yorum yaparak e-posta gönderdim ve yorumumu neden yanlış olduğunu ve neden böyle çalıştığını ayrıntılı bir açıklama ile icat eden araştırmacıdan 24 saat içinde bir yanıt aldım. Bunu Anders Hejlsberg ;-) 'den asla alamadım. Ben her zaman çözümler için Google’ı ve bunları C #, VB veya hatta IronPython ile yazılmış buluyorum ancak 3 yıl içinde F # sektörünü kullanarak, çözümü F # 'a çevirmenin önemsiz olmadığı tek bir örneği hatırlayabiliyorum. Aslında, geçenlerde C # sample veri seri hale getiricisini MSDN'den F # 'ye dönüştürdüm ve 5 kat daha kısaydı. Sonunda, NUnit gibi araçlarda F # desteğinden bahsettiniz. NUnit'i F # 'dan bir süredir problemsiz olarak kullanıyordum. Bunlar .NET araçları, C # araçları değil.

Örnek olay : Mevcut müşterim sadece ünite testi için NUnit'i kullanmakla kalmıyor, aynı zamanda FD'de TickSpec'i BDD için SpecFlow'a teknik olarak daha üstün bir alternatif olarak NUnit'in üzerine kurdu. Yazar, TickSpec'in SpecFlow'un boyutunun küçük bir kesri olduğunu ve daha fazla özellik sağladığını gösterme noktasına geldi. Dahası, F # deneyimi olmayan iş yerindeki geliştiricilerin birçoğu (ve, daha önce fonksiyonel programlama deneyimi olmadığına inanıyorum), bunu sorunsuzca çözdü ve F # + TickSpec çözümlerini çözmeyi kolaylaştırdığı için ilgisiz bir projede kullanmaya başladı. sorunları.

FWIW, müvekkilime F # .NET Journal'ımıza ücretsiz bir site aboneliği verdim .

HTH!


3
Düzgün değerlendirme: hızlı bir şekilde bir iş geliştirme karışımına katmaya değmeyeceğini öğrenebileceğiniz bir dil. F # 'daki amaç fonksiyonel kod yazmaktır ve çoğu insan fonksiyonel programlamayı bu kadar hızlı öğrenemez.
David Thornley

8
Düz çıkışlı sayaç örneği: LINQ. İşlevsel kodun yazılması, kesinlikle "işlev" tanımıyla F # noktası değildir. Mevcut C # devs bağlamında, onlar zaten orada yarı yolda olmalıdır System.Func.
Jon Harrop,

1
F # öncelikli olarak fonksiyonel programlama ile ilgili değilse, gerçekte ne ile ilgili? F # 'nın C #' dan daha iyi oturduğunu nasıl anlarsınız?
Robert Harvey,

5
@Robert: F #, C # 'dan çok daha üretken kılan çeşitli özellikler sunar. Değişken türleri ve desen eşleştirmesi, derleyicilerden bilgisayar grafiklerine kadar her şeyde görünen ağaçları oluşturmak ve işlemek için oldukça güçlüdür. Tür çıkarımı, yoğun algoritmalar için ideal olan genel kod yazmayı kolaylaştırır. Etkileşimli oturumlar, bir formdan diğerine veri kümeleri masaj yapmak veya hatta karmaşık analizler yapmak gibi tek kullanımlık kodlar için idealdir. Bu özellikler sadece tesadüfen işlevsel programlama ile ilgilidir ve hepsi zorunlu kodda iyi çalışır.
Jon Harrop

8

İlk noktanızda tanıdığınız gibi, F # bilmeyen programcılarınız kod tabanınızın F # bölümünde çalışamazlar. Bununla birlikte, kullanmanın avantajlarını elde etmek için F # 'daki tüm kod tabanınızı yeniden yazmanıza gerek yoktur - sadece en büyük yararı göreceğiniz parçaları yeniden yazın. F # 'nin C # ile iyi bir şekilde birlikte çalışması, bazı parçaların oyulmasını ve onlardan F # montajları oluşturmayı nispeten kolay hale getirmelidir.

Mühendislerinizi geleneksel 3 katmanlı bir uygulama üzerinde çalışıyorsanız, hepsinin derin bir SQL, HTML, Javascript, CSS, vb. Bilgisine sahip olmaları için ısrar edemezsiniz. Bunun yerine, doğal olarak çalışan bazı uzmanlara sahip olacaksınız. Uygulamanın farklı bölümlerinde. Bu nedenle, başvurunuzun bir kısmı için yeni bir dil eklemenin bir engel teşkil etmeyeceğini düşünüyorum. Ayrıca, F # kodunuzun derin bir F # geçmişi olmayan mühendisler tarafından bile okunabilir olduğundan emin olmak için kodlama standartlarını ve diğer uygulamaları kullanabilirsiniz .


1
@kvb, yorumum biraz kapalı bir konudur, ancak sadece bunu paylaşmak istedim, ancak ideal olarak pratikte birçok şirketin sizin tanımladığınız gibi uzmanlaşmış pozisyonları olmadığını ve sizin örneğinizde olduğu gibi, tek bir geliştiricinin derinlemesine sahip olmasını gerektirdiğini (yeterli) SQL, HTML, Javascript, CSS, vb. bilgileri ve belki de iş analizi bilgisi. Ben şahsen her iki senaryo (altında çalıştık değil şirket boyutuna göre belirlenir) ve her 's avantajları ve dezavantajları vardır ve proje başına bazında daha fazla veya daha az uygun olabilir, ancak uzmanlık kesinlikle lüks.
Stephen Swensen

7

F # 'yi kullandığınız dillere eklemenin tuzakları arasında, yeni teknolojilerin kullanılmasının tehlikeleri var. Avantajlarından bağımsız olarak, eğer ekibinizden bazıları öğrenmek istemiyorsa veya öğrenecek kadar esnek değilse, F # projeleri üzerinde çalışamazlar. Bununla birlikte, ekibinizdeki dinozorların yeni teknolojilerin benimsenmesini engellemesine izin verirseniz, şirketiniz mahkum olur.

Şahsen yaşadığım tek tuzaklar:

  1. Hata ayıklama sırasında zorluklar. İfade tabanlı bir programın deyim tabanlı diller için tasarlanmış bir hata ayıklayıcıda yürütülmesinin akışını takiben zor olabilir.

  2. Sinir bozucu intellisense. Otomatik tamamlama tam ihtiyacınız olduğunda çalışmayı durdurur. Microsoft, arka plan ayrıştırıcısını hataya daha dayanıklı hale getirmek için çalışmalıdır.

  3. Girinti duyarlı sözdizimi, kopyala-yapıştır veya yeniden biçimlendirme kodunu zorlaştırır.

  4. Yeniden düzenleme eksikliği.

  5. F # için mevcut uygun VS uzantılarının bazıları (kod katlama, derinlik renklendirme), yazım deneyimini biraz sinir bozucu yapan biraz yavaş.

Benim düşünceme göre, bu sorunların hiçbiri show-stoper değil ve şu an için onlarla yaşayabilirim. Araçları geliştirmek ve düzeltmek dillerden daha kolaydır.

F # ile yazabilecek yeni programcıları işe almanın korkusu oldukça yaygındır ama bence haksız. Kodlama yönergeleri yazacak olsaydınız, C #:, yield returnLINQ nesnesine, lambdalara, yaklaşanlara aşağıdaki özelliklerden herhangi birine karşı uyarır ya da yasaklar asyncmısınız?

Bu özelliklerin daha iyi kod yazmanıza yardımcı olduğunu düşünüyorsanız, F # 'dan kaçınmanız için hiçbir neden yoktur. Dil, bu özellikleri pürüzsüz ve iyi düşünülmüş bir şekilde destekliyor, C #'nın mirası nedeniyle yapamadığı bir şey.

Eğer takımınız bahsettiğim özelliklerin ardındaki kavramları anlayacak kadar akıllıysa, F # 'da mükemmel programcılar olmaları için gereken her şeye sahipler. Gelecekteki acemiler için de aynı şey geçerli: C # 1.0'dan sonra sunulan özellikleri kullanmaktan aciz veya isteksiz birini işe alır mıydınız?


5

Bu kesin durumu düşündüm.

Takımım için planladığım şey bu:

  • C # 'yı F # ile karıştırın, bu kod bazının çoğunluğu için C # kullanılarak yapılabilir. Ağır veri işlemenin gerekli olduğu durumlarda , ilişkili işlevleri F # 'ye yazın ve bir dll içine koyun veya referans verin. Burada örnek

  • Mevcut kod tabanınızı yukarıdaki şekilde yavaşça yeniden değerlendirin.

  • Tüm kodların işlevsel olması gerekmez.

  • Takımınızın hafta sonları LISP olan Haskell'in temellerini öğrenmesini sağlayın .

  • Euler Projesi bulmacalarını çözmeye çalışarak F # öğrenmelerini sağlayın (F # öğrenirken bana çok yardımcı oldu). Yine bu, hafta sonu boyunca veya "eğitim" için bir gün ayırmak istiyorsanız çalışma süresi boyunca söylenilen bir şey olmalıdır.


15
geliştiricilere hafta sonu boyunca bunun üzerinde çalışacakları için para mı ödeyeceksin? Lord, hafta sonları ve akşamları F # öğrenmek için harcadığımı biliyor ama hobi olarak. Bu doğru olsa da ben bir Grails aday gösterildi zaman kısmen kapalı süre içinde kendimi o çerçeveyi öğretti proje, ama bu sadece benim kişiliğim ve ben zevk, ama herkes olsaydı o anlattı bana isterim benim off-süre içinde bunu yapmak için mutlu değil
Stephen Swensen

+1 fakat: Haskell ve Lisp tamamen akademik ilgi çekmektedir. Bu dilleri öğrenmeleri için bir .NET programcısına değer katacağını sanmıyorum. Bence (birkaç F # kitabının yazarı olarak ;-) iyi bir kitap okumanın F # kodunu yazmayı denemek (Euler projesi gibi) vakum içinde yazmaktan daha verimli olacağını düşünüyorum. Rehberlikle bir ay içinde hızlanabiliyorlar.
Jon Harrop,

4

1) İşlevsel bir dil öğrenmek birisinin programcı olarak genel yeteneğini arttırır, ancak bu sadece öğrenmek ve geliştirmek isteyenler için geçerlidir. Her programcı daha iyi olmak istemez, çalışma ortamında da değişiklik yapmak istemez (ekibinizi tanıyın).

2) Bununla tartışamam. Herhangi bir yeni dilin 6 aylık öğrenme eğrisi için ödeme yapmanız gerekecek, ancak zaten .net kütüphanelerini tanımak, yeni kütüphaneler öğrenmek için gereken fazladan yılları ortadan kaldırıyor.

3) Toplumsal destek C # 'dan daha küçükken, web'de görev alan epeyce yetenekli aktif F # geliştiricilere sahiptir. Çoğu dil desteğinin kütüphane desteği olduğunu ve .NET için mükemmel bir destek olduğunu unutmayın.

Bin kiloluk gorilin burada risk yönetimi var. "Kenar kesme olabilir, ancak kanama kenarı değil." F # 'nin kanama olmadığını iddia ediyorum. VS2010 ile piyasaya sürüldü ve doğrudan Microsoft tarafından destekleniyor. Kanama kenarı "beta" ve Microsoft'tan hiçbir şeyden sorumlu olmama konusunda bir şeyler söyleyen bir feragatnamedir.


Birisi C # ve .Net platformunu zaten biliyorsa, F # öğrenmek genellikle bir aydan daha az bir ücrete tabidir. (iki iş arkadaşımın tecrübesine dayanarak.)

4

Pratik bir mesele olarak, IntelliSense desteği oldukça yetersizdir - C # 'da mevcut olan daha az karmaşık olan otomatik tamamlama ile verimlilik türündeki çıkarımların gerçekleştiği noktaya kadar.

Hatalı tür çıkarımlarının neden olduğu hata mesajları, yeni başlayanlar için (ve genellikle kendim gibi ara kullanıcılar için) düzeltmek için daha uzun sürer, çünkü C # gibi bir dilde olduğundan daha fazla yazım açıklaması yapma eğilimindesinizdir.

OOP ayrıca F # 'da şaşırtıcı yollardan yoksundur; örneğin, yuvalanmış türler / sınıflar için destek yoktur. Kod taşırken dikkatli olmalısınız, çünkü C # ile yapabileceğiniz bazı şeyler vardır, F # ile yapamazsınız, ne yazık ki.

Son fakat en az değil , F # topluluğunun hem boyutu hem de kalitesi hayal kırıklığı yaratıyor. İnternetteki F # bilgilerinin çoğu ya eski sürümler içindir ya da sadece çok iyi değildir - ya aptalca olmayan, düşük performans ya da yanlış. Sonra, büyük ölçüde sadece mevcut bilgi özeti olan haber bültenleri için büyük para talep eden insanlar var.

Kendimi iş projeleri için C # ve kendi işlerim için F # kullanıyorum. F # 'yi sevdiğim kadar, ne yazık ki, işlerin nasıl / ne zaman ayrılacağını tahmin etmek biraz zor.


1
Bir geliştiriciyi eğitmek için £ 39 "büyük para" ise, F # öğrenmek endişelerinizin en küçüğüdür, IMHO.
Jon Harrop

Uh oh, adamın kendisi. Dostum, sen her yerdesin, değil mi? £ 39 aslında bu gün ve yaşta neredeyse her zaman bloglarda veya teknik makalelerde bulunan bilgi türleri için büyük paradır.
Rei Miyasaka,

2
Tüm çok alakalı bilgiler, kişilerin gönderinizi neden aşağı oy kullandığından emin değilim. F # 'dan hoşlandığım kadarıyla, soru olumsuz yönleriyle ilgili olmalı ve bunları işaret eden yazılar F # -lovers tarafından aşağı oy kullanılmamalıdır.
Joh

1

Asıl sorun her zaman bakımdır.

Scheme'de kodlamayı çok isterdim, ama bir sonraki bakıcı muhtemelen beni avlamak ve bana işkence etmek isteyecektir.


Ya bir sonraki bakıcı Scheme'i biliyorsa? Comp.lang.lisp adresinde, Lisp programcılarının gerektiğinde işverenlerine değişiklik sağlayabilmek amacıyla ağ oluşturduklarını okudum.
Larry Coleman

0

Yapmanız gereken ilk şey takım üyelerinize F # 'yı tanıtmak konusunda neler hissettiklerini sormak olduğunu söyleyebilirim. Eğer bu fikirden hoşlanırlarsa, her şey o kadar yumuşak olur ki o zaman istemezler.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.