Reale Fallstricke bei der Einführung von F # in einem großen Codebasis- und Entwicklungsteam [geschlossen]

37

Ich bin CTO einer Softwarefirma mit einer großen vorhandenen Codebasis (alles in C #) und einem großen Engineering-Team. Ich kann sehen, wie bestimmte Teile des Codes in F # viel einfacher zu schreiben wären, was zu einer schnelleren Entwicklungszeit, weniger Fehlern, einfacheren parallelen Implementierungen usw. führen würde. Dies ist im Grunde genommen ein Produktivitätsgewinn für mein Team. Bei der Einführung von F # sehe ich jedoch auch einige Produktivitätsprobleme:

1) Jeder muss F # lernen, und es ist nicht so trivial, wie beispielsweise von Java auf C # zu wechseln. Teammitglieder, die F # nicht gelernt haben, können nicht an F # -Teilen der Codebasis arbeiten.

2) Der Pool an anstellbaren F # -Programmierern ist ab sofort (Dezember 2010) nicht mehr vorhanden. Durchsuchen Sie verschiedene Datenbanken für Softwareentwickler-Lebensläufe nach "F #", wobei weniger als 1% der Lebensläufe das Schlüsselwort enthalten.

3) Community-Unterstützung ist ab sofort (Dezember 2010) weniger verfügbar. Sie können fast jedes Problem in C # googeln und jemanden finden, der sich bereits damit befasst hat, nicht so mit F #. Die Unterstützung von Tools von Drittanbietern (NUnit, Resharper usw.) ist ebenfalls lückenhaft.

Mir ist klar, dass dies ein bisschen Catch-22 ist, dh wenn Leute wie ich kein F # verwenden, werden die Community und die Tools niemals zustande kommen usw. Aber ich muss eine Firma leiten, und ich kann auf dem neuesten Stand sein, aber nicht ausblutend.

Irgendwelche anderen Fallstricke, über die ich nicht nachdenke? Oder möchte jemand die erwähnten Fallstricke widerlegen? Ich denke, dies ist eine wichtige Diskussion und würde gerne Ihre Gegenargumente in diesem öffentlichen Forum hören, die viel dazu beitragen könnten, die Akzeptanz von F # in der Industrie zu erhöhen.

nganju
quelle
7
"Der Pool an anstellbaren F # -Programmierern [...] ist nicht vorhanden" - Fast nicht vorhanden. Wenn Sie jedoch einen Programmierer finden, der sich auf F # spezialisiert hat oder spezialisiert sein möchte, ist dies wahrscheinlich etwas ganz Besonderes.
Tim Robinson
Sie fragen nach realen Fallstricken, berücksichtigen aber potenzielle Fallstricke in Ihrer Frage. Dies ist eine Einladung für mehr "imaginäre" Fallstricke bei Antworten oder für themenfremde Antworten, die die von Ihnen in Betracht gezogenen Fallstricke widerlegen. Wenn ich Ihr wegen dieses Formulierungsproblems ablehnen könnte (Ruf zu gering)
Joh
Nick, ich würde sagen: Wählen Sie einige erfahrene, fähige Sprachfreaks aus, die Sie bereits haben, und lassen Sie sie mit F # spielen, um das Unternehmen intelligenter, besser und produktiver zu machen, und das nicht nur zum Spaß. Es gibt ein paar solche Leute, bei denen ich arbeite.
Job

Antworten:

28

Die Suche nach anderen funktionalen Sprachen wie Scheme, Lisp oder Haskell wird fortgesetzt. Viele Leute lernen diese in der Schule und haben sie in ihren Lebensläufen; Ich bin mir sicher, dass es vielen nichts ausmacht, F # zu lernen. Ich habe Schema in meinem Lebenslauf, obwohl ich es nach der Schule nie benutzt habe und ein Job mit F # würde wahrscheinlich auch meine Aufmerksamkeit auf sich ziehen.

MK
quelle
13

Irgendwelche anderen Fallstricke, über die ich nicht nachdenke?

In der Praxis besteht der Hauptfehler, den ich sehe, darin, die Verwendung von F # für Probleme zu erzwingen, bei denen es sich um das falsche Werkzeug für den Job handelt.

Oder möchte jemand die erwähnten Fallstricke widerlegen?

Sie sind alle in gewissem Maße berechtigte Bedenken, aber ich würde fragen, in welchem ​​Maße.

Sie sagen beispielsweise, dass jeder F # lernen müsste, um an F # -Code zu arbeiten. Dies ist zwar wahr, aber in der Praxis keine große Sache. Das Erlernen von F # ist nicht wichtiger als das Erlernen von WPF, Silverlight oder der TPL. Ich unterrichte zurzeit ungefähr 30 Entwickler in der Verwendung von F # für einen Kunden in London, und ungefähr ein Dutzend arbeitete bereits nach wenigen Wochen in Vollzeit an F # -Code, und sie haben gerade ihr erstes Produkt ausgeliefert (pünktlich und im Budget). ) nach nur wenigen Monaten fast vollständig in F # geschrieben. Tatsächlich hatten sie mehr technische Schwierigkeiten mit Silverlight als mit F # und stellten fest, dass der technische Support für Silverlight viel schlechter war als für F #.

Sie beziehen sich auf den relativ kleinen Pool verfügbarer F # -Programmierer, aber angesichts der Leichtigkeit, mit der F # erlernt werden kann, ist dies meines Erachtens kein wesentliches Problem. Ich bezweifle, dass Sie gegebenenfalls viele einstellen müssen. Mein Kunde hat zwei F # -Mitarbeiter für über 100 Programmierer. Unsere Aufgabe ist es, die Verwendung von F # zu bestimmen und zu überwachen.

Ihr drittes und letztes Anliegen betrifft weniger Community-Support, Googeln nach C # -Lösungen im Vergleich zu F # und Tool-Support von Drittanbietern. Auch hier habe ich nicht festgestellt, dass dies in der Praxis problematisch ist. Ich schickte fsbugs eine E-Mail mit einem Kommentar zu Maßeinheiten in F # und erhielt innerhalb von 24 Stunden eine Antwort von dem Forscher, der sie erfunden hatte, mit einer detaillierten Erklärung, warum meine Interpretation falsch war und warum sie so funktioniert. Ich habe das nie von Anders Hejlsberg bekommen ;-). Ich google die ganze Zeit nach Lösungen und finde sie in C #, VB oder sogar IronPython geschrieben, kann mich aber in 3 Jahren mit der F # -Industrie an nur eine einzige Instanz erinnern, in der die Übersetzung der Lösung in F # nicht trivial war. Tatsächlich habe ich kürzlich das C # -Beispiel des Datenserialisierers von MSDN in F # konvertiert und es war 5 × kürzer. Schließlich haben Sie die F # -Unterstützung in Tools wie NUnit erwähnt, als wir Ich benutze NUnit von F # seit einiger Zeit ohne Probleme. Hierbei handelt es sich um .NET-Tools, nicht um C # -Tools.

Fallstudie : Mein aktueller Kunde verwendet NUnit nicht nur für Unit-Tests, sondern hat TickSpec in F # auf NUnit als technisch überlegene Alternative zu SpecFlow für BDD erstellt. Der Autor hat mir bewusst gezeigt, dass TickSpec ein winziger Bruchteil der Größe von SpecFlow ist und mehr Funktionen bietet. Darüber hinaus haben einige der Entwickler, die noch keine F # -Erfahrung (und meines Erachtens auch keine Erfahrung in der funktionalen Programmierung) haben, diese ohne Probleme aufgegriffen und in anderen Projekten eingesetzt, gerade weil F # + TickSpec die Lösung ihrer Probleme erleichtert Probleme.

FWIW, ich gab meinem Kunden ein kostenloses Site-Abonnement für unser F # .NET-Journal, das bei vielen Entwicklern, die F # lernen, gut ankam.

HTH!

Jon Harrop
quelle
3
Umfassende Behauptung: Eine Sprache, die Sie so schnell lernen können, ist es nicht wert, sie zu einem Mix aus Geschäftsentwicklungen hinzuzufügen. In F # geht es darum, funktionalen Code zu schreiben, und die meisten Leute werden das funktionale Programmieren nicht so schnell lernen.
David Thornley
8
Beispiel für einen Flat-Out-Zähler: LINQ. Das Schreiben von funktionalem Code ist nach beiden Definitionen von "funktional" absolut nicht der Punkt von F #. Im Kontext bestehender C # -Entwickler sollten sie bereits auf halber Strecke mit dabei sein System.Func.
Jon Harrop
1
Wenn es in F # nicht in erster Linie um funktionale Programmierung geht, worum geht es dann wirklich? Woher wissen Sie, wann F # besser passt als C #?
Robert Harvey
5
@Robert: F # bietet eine Vielzahl von Funktionen, mit denen es viel produktiver als C # wird. Variantentypen und Pattern Matching sind äußerst leistungsstark für die Erstellung und Bearbeitung von Bäumen, die von Compilern bis hin zu Computergrafiken reichen. Mit der Inferenz von Eingaben ist es einfach, stark generischen Code zu schreiben, der sich ideal für dichte Algorithmen eignet. Die interaktiven Sitzungen eignen sich ideal für Einweg-Code, z. B. zum Massieren von Datensätzen von einer Form in eine andere oder sogar zum Durchführen komplexer Analysen. Diese Funktionen beziehen sich nur nebenbei auf die funktionale Programmierung und funktionieren auch in imperativem Code.
Jon Harrop
8

Wie Sie in Ihrem ersten Punkt erkennen, können Ihre Programmierer, die F # nicht kennen, nicht mit dem F # -Teil Ihrer Codebasis arbeiten. Sie müssen jedoch nicht Ihre gesamte Codebasis in F # umschreiben, um die Vorteile der Verwendung zu nutzen. Schreiben Sie einfach die Teile neu, bei denen Sie den größten Vorteil sehen würden. Die Tatsache, dass F # wirklich gut mit C # zusammenarbeitet, sollte es relativ einfach machen, bestimmte Teile herauszuschneiden und daraus F # -Baugruppen zu erstellen.

Wenn Ihre Ingenieure an einer herkömmlichen dreistufigen Anwendung arbeiten müssten, würden Sie wahrscheinlich nicht darauf bestehen, dass sie alle über umfassende Kenntnisse in SQL, HTML, Javascript, CSS usw. verfügen. Stattdessen müssten natürlich einige Spezialisten arbeiten auf verschiedenen Teilen der Anwendung. Daher denke ich nicht, dass das Hinzufügen einer neuen Sprache für einen Teil Ihrer Anwendung eine zu große Hürde sein sollte. Darüber hinaus können Sie Coding - Standards und andere Praktiken verwenden , um zu versuchen , um sicherzustellen , dass Ihr F # Code ist lesbar , auch von den Ingenieuren ohne tiefen Fis Hintergrund.

kvb
quelle
1
@kvb, mein Kommentar ist ein wenig abseits des Themas, wollte aber nur mitteilen, dass viele Unternehmen, obwohl normalerweise ideal, in der Praxis keine speziellen Positionen haben, wie Sie beschrieben haben, und verlangen, dass, wie in Ihrem Beispiel, ein einzelner Entwickler tief greift (ausreichende) Kenntnisse in SQL, HTML, Javascript, CSS usw. und möglicherweise auch in der Geschäftsanalyse. Ich habe persönlich in beiden Szenarien gearbeitet ( nicht von der Unternehmensgröße abhängig), und jede hat ihre Vor- und Nachteile und ist auf Projektbasis mehr oder weniger angemessen, aber Spezialisierung ist sicherlich Luxus.
Stephen Swensen
7

Die Fallstricke beim Hinzufügen von F # zu den von Ihnen verwendeten Sprachen umfassen die Fallstricke bei der Einführung neuer Technologien. Unabhängig von den Vorteilen kann ein Teil Ihres Teams nicht an F # -Projekten arbeiten, wenn er nicht lernfähig oder flexibel genug ist. Wenn Sie jedoch zulassen, dass Dinosaurier in Ihrem Team die Einführung neuer Technologien verhindern, ist Ihr Unternehmen zum Scheitern verurteilt.

Die einzigen Fallstricke, die ich persönlich erlebt habe, sind:

  1. Schwierigkeiten beim Debuggen. Das Verfolgen des Ablaufs der Ausführung eines ausdrucksbasierten Programms in einem Debugger für anweisungsbasierte Sprachen kann schwierig sein.

  2. Frustrierender Intellisense. Die automatische Vervollständigung funktioniert genau dann nicht mehr, wenn Sie sie benötigen. Microsoft muss daran arbeiten, den Hintergrundparser fehlertoleranter zu machen.

  3. Einrückungssensitive Syntax erschwert das Kopieren, Einfügen oder Neuformatieren von Code.

  4. Mangel an Refactoring.

  5. Einige der vorhandenen praktischen VS-Erweiterungen für F # (Code-Faltung, Tiefenfärbung) sind etwas langsam, was das Tipperlebnis etwas frustrierend macht.

Meiner Meinung nach ist keines dieser Themen ein Muss, und ich kann vorerst damit leben. Tools sind einfacher zu verbessern und zu reparieren als Sprachen.

Ihre Befürchtungen, dass es schwierig sein könnte, neue Programmierer einzustellen, die in der Lage sind, in F # zu schreiben, sind weit verbreitet, aber meiner Meinung nach ungerechtfertigt. Wenn Sie Codierungsrichtlinien schreiben würden, würden Sie eine der folgenden Funktionen in C # abraten oder verbieten: yield returnLINQ für Objekte, Lambdas, die bevorstehende async?

Wenn Sie glauben, dass diese Funktionen beim Schreiben von besserem Code helfen, gibt es keinen Grund, auf F # zu verzichten. Die Sprache unterstützt diese Funktionen reibungslos und durchdacht, was C # aufgrund seines Erbes nicht wirklich kann.

Wenn Ihr Team klug genug ist, die Konzepte hinter den von mir erwähnten Funktionen zu verstehen, hat es alles, was es braucht, um exzellente Programmierer in F # zu sein. Das Gleiche gilt für zukünftige Rekruten: Würden Sie jemanden einstellen, der nicht in der Lage oder nicht bereit ist, die nach C # 1.0 eingeführten Funktionen zu nutzen?

Joh
quelle
5

Ich habe über genau diese Situation nachgedacht.

Folgendes plane ich für mein Team:

  • Mischen Sie C # mit F #. Dies kann durch Verwenden von C # für den Großteil der Codebasis erfolgen. Wenn eine umfangreiche Datenverarbeitung erforderlich ist, schreiben Sie die zugehörigen Funktionen in F # und fügen Sie sie in eine DLL ein oder referenzieren Sie sie. Beispiel hier

  • Berechnen Sie Ihre vorhandene Codebasis auf die oben beschriebene Weise langsam neu.

  • Nicht jeder Code muss funktionsfähig sein.

  • Lassen Sie Ihr Team an den Wochenenden die Grundlagen von Haskell, LISP , erlernen .

  • Bringen Sie sie dazu, F # zu lernen, indem Sie versuchen, Rätsel des Euler-Projekts zu lösen (das hat mir beim Erlernen von F # sehr geholfen). Auch dies sollte über das Wochenende oder während der Arbeitszeit geschehen, wenn Sie einen Tag für "Training" vorsehen möchten.

Darknight
quelle
15
Wirst du deine Entwickler dafür bezahlen, dass sie am Wochenende daran arbeiten? Herrgott weiß, ich habe viele Wochenenden und Abende damit verbracht, F # zu lernen, aber als Hobby. Es ist zwar richtig, dass ich mir, als ich für ein Grails-Projekt gewonnen wurde, diesen Rahmen teilweise in der Freizeit beigebracht habe, aber das ist nur meine Persönlichkeit und ich habe es genossen, aber wenn mir jemand gesagt hätte, dass ich das in meiner Freizeit tun soll, würde ich es tun nicht glücklich gewesen.
Stephen Swensen
+1 aber: Haskell und Lisp sind von rein akademischem Interesse. Ich glaube nicht, dass es für einen .NET-Programmierer einen Mehrwert darstellt, wenn er diese Sprachen lernt. Ich denke (als Autor mehrerer F # -Bücher ;-), dass das Lesen eines guten Buches produktiver wäre als der Versuch, F # -Code (wie Projekt-Euler-Rätsel) im Vakuum zu schreiben. Unter Anleitung können sie in einem Monat auf dem neuesten Stand sein.
Jon Harrop
4

1) Das Erlernen einer funktionalen Sprache erhöht die allgemeinen Fähigkeiten eines Programmierers. Dies gilt jedoch nur für diejenigen, die lernen und sich verbessern möchten. Nicht jeder Programmierer möchte besser werden und auch nicht seine Arbeitsumgebung ändern (kennen Sie Ihr Team).

2) Ich kann damit nicht streiten. Sie müssen für die 6-monatige Lernphase jeder neuen Sprache zahlen, jedoch werden durch die Kenntnis der .net-Bibliotheken die zusätzlichen Jahre für das Erlernen neuer Bibliotheken eingespart.

3) Community-Support, obwohl kleiner als C #, hat einige hochqualifizierte aktive F # -Entwickler, die Beiträge im Web veröffentlichen. Vergessen Sie nicht, dass der Großteil der Sprachunterstützung Bibliotheksunterstützung ist und .NET großartig unterstützt wird.

Der tausend Pfund schwere Gorilla ist hier Risikomanagement. "Ich kann schneidig sein, aber nicht schneidig." Ich würde argumentieren, dass F # nicht am Puls der Zeit ist. Es wurde mit VS2010 veröffentlicht und wird direkt von Microsoft unterstützt. Vorreiter ist "Beta" und ein Haftungsausschluss von Microsoft, der besagt, dass man für nichts verantwortlich ist.

gradbot
quelle
Wenn jemand bereits mit C # und der .NET-Plattform vertraut ist, kostet das Erlernen von F # in der Regel weniger als einen Monat. (basierend auf den Erfahrungen meiner beiden Mitarbeiter)
4

In der Praxis mangelt es an IntelliSense-Unterstützung - bis zu dem Punkt, an dem die Produktivitätsgewinne bei der Typinferenz durch die weniger ausgefeilte automatische Vervollständigung in C # übertroffen werden.

Die durch fehlerhafte Typinferenzen verursachten Fehlermeldungen brauchen auch für Anfänger (und häufig für fortgeschrittene Benutzer wie mich) länger, weil Sie weniger geneigt sind, Typanmerkungen bereitzustellen, als dies in einer Sprache wie C # der Fall wäre.

OOP fehlt auch in überraschender Weise in F #; Beispielsweise gibt es keine Unterstützung für verschachtelte Typen / Klassen. Sie müssen vorsichtig sein, wenn Sie Code portieren, da es einige Dinge gibt, die Sie in C # tun können, die Sie in F # leider nicht tun können.

Last but not least sind sowohl die Größe als auch die Qualität der F # -Community enttäuschend. Viele der F # -Informationen im Web sind entweder für alte Versionen oder einfach nicht sehr gut - entweder nicht idiomatisch, schlechte Leistung oder rundherum falsch. Dann gibt es Leute, die viel Geld für Newsletter verlangen, die größtenteils nur aus vorhandenen Informationszusammenfassungen bestehen.

Ich selbst benutze C # für Arbeitsprojekte und F # für meine eigenen Sachen. So sehr ich F # liebe, ist es leider ein bisschen schwer vorherzusagen, wie / wann die Dinge auseinanderfallen könnten.

Rei Miyasaka
quelle
1
Wenn £ 39 "enormes Geld" für die Schulung eines Entwicklers ist, ist das Erlernen von F # meiner Meinung nach die geringste Sorge für Sie.
Jon Harrop
Oh, der Mann selbst. Mann, du bist überall, nicht wahr? £ 39 ist in der Tat ein riesiges Geld für die Art von Informationen, die heutzutage fast immer in Blogs oder Fachzeitschriften zur Verfügung gestellt werden.
Rei Miyasaka
2
Alles sehr relevante Informationen, ich bin mir nicht sicher, warum Leute Ihren Beitrag runterstimmen. So sehr ich F # mag, hat die Frage mit den negativen Seiten zu tun, und Posts, die darauf hinweisen, sollten von F # -Liebhabern nicht herabgestimmt werden.
Joh
1

Das Hauptproblem ist immer die Wartbarkeit.

Ich würde gerne in Scheme codieren, aber der nächste Betreuer würde mich wahrscheinlich jagen und mich foltern wollen.

Leppie
quelle
Was ist, wenn der nächste Betreuer auch das Schema kennt? Ich habe auf comp.lang.lisp gelesen, dass Lisp-Programmierer sich vernetzen, um ihren Arbeitgebern bei Bedarf Ersatz anbieten zu können.
Larry Coleman
0

Ich würde sagen, dass Sie als Erstes Ihre Teammitglieder fragen müssen, wie sie es finden, F # einzuführen. Wenn sie die Idee mögen, wird alles viel reibungsloser verlaufen, wenn sie es nicht tun.

Nemanja Trifunovic
quelle