J'ai écrit une demande pour équilibrer le calendrier national de production d'électricité d'un portefeuille de centrales électriques et une position commerciale pour une société d'énergie. Les composants client et serveur étaient en C # mais le moteur de calcul a été écrit en F #.
L'utilisation de F # pour répondre à la complexité au cœur de cette application démontre clairement un sweet spot pour le langage dans les logiciels d'entreprise, à savoir l'analyse algorithmiquement complexe de grands ensembles de données. Mon expérience a été très positive. En particulier:
Unités de mesure L'industrie dans laquelle je travaille est jonchée d'unités. Les équations que j'ai mises en œuvre (souvent de nature géométrique) traitaient des unités de temps, de puissance et d'énergie. Faire vérifier par le système de typage l'exactitude des unités des entrées et sorties des fonctions est un gain de temps énorme, tant en termes de test que de lecture / compréhension du code. Il supprime toute une classe d'erreurs auxquelles les systèmes précédents étaient sujets.
Programmation exploratoire Travailler avec des fichiers de script et le REPL (F # Interactive) m'a permis d'explorer l'espace de la solution plus efficacement avant de s'engager dans une implémentation que la boucle d'édition / compilation / exécution / test plus traditionnelle. C'est un moyen très naturel pour un programmeur de développer sa compréhension du problème et des tensions de conception en jeu.
Test unitaire Le code écrit à l'aide de fonctions sans effet secondaire et de structures de données immuables est un plaisir à tester. Il n'y a pas d'interactions complexes dépendant du temps pour bousiller les choses ou de grands ensembles de dépendances à moquer.
Interopérabilité J'ai défini l'interface avec le moteur de calcul en C # et implémenté le calcul en F #. Le moteur de calcul pourrait ensuite être injecté dans n'importe quel module C # qui devait l'utiliser sans aucun souci d'interopérabilité. Sans couture. Le programmeur C # n'a jamais besoin de savoir.
Réduction du code La plupart des données introduites dans le moteur de calcul étaient sous forme de vecteurs et de matrices. Les fonctions d'ordre supérieur les mangent pour le petit déjeuner avec un minimum d'agitation, un code minimal. Belle.
Manque de bugs La programmation fonctionnelle peut sembler étrange. Je peux travailler sur un algorithme, en essayant de faire en sorte que le code passe le vérificateur de type, mais une fois que le vérificateur de type est satisfait, cela fonctionne. Son presque binaire, soit il ne compilera pas ou son correct. Les erreurs de cas de bord étranges sont minimisées, la récursivité et les fonctions d'ordre supérieur suppriment beaucoup de code de comptabilité qui introduit des erreurs de cas de bord.
Parallélisme La pureté fonctionnelle de l'implémentation résultante le rend mûr pour exploiter le parallélisme inhérent au traitement des vecteurs de données. C'est peut-être là que j'irai maintenant maintenant que .NET 4 est sorti.