J'ai écrit une application pour équilibrer le programme national de production d'électricité pour un portefeuille de centrales électriques à une position commerciale pour une société d'énergie. Les composants client et serveur étaient en C# mais le moteur de calcul était écrit en F#.
L'utilisation de F# pour traiter la complexité au cœur de cette application démontre clairement un point fort du langage dans les logiciels d'entreprise, à savoir l'analyse algorithmique complexe de grands ensembles de données. Mon expérience a été très positive. En particulier :
Unités de mesure Le secteur dans lequel je travaille est truffé d'unités. Les équations que j'ai mises en œuvre (souvent de nature géométrique) portaient sur des unités de temps, de puissance et d'énergie. Le fait que le système de type vérifie l'exactitude des unités des entrées et des sorties des fonctions représente un gain de temps considérable, tant en termes de tests que de lecture/compréhension du code. Il permet d'éradiquer toute une série d'erreurs que les systèmes précédents étaient susceptibles de commettre.
Programmation exploratoire Travailler avec des fichiers script et le REPL (F# Interactive) m'a permis d'explorer l'espace de solution plus efficacement avant de m'engager dans une implémentation que la boucle plus traditionnelle d'édition/compilation/exécution/test. C'est une façon très naturelle pour un programmeur de développer sa compréhension du problème et des tensions de conception en jeu.
Tests unitaires Le code écrit à l'aide de fonctions sans effet de bord et de structures de données immuables est un plaisir à tester. Il n'y a pas d'interactions complexes dépendant du temps pour faire foirer les choses ou de grands ensembles de dépendances à simuler.
L'interopérabilité J'ai défini l'interface avec le moteur de calcul en C# et j'ai implémenté le calcul en F#. Le moteur de calcul pouvait alors être injecté dans n'importe quel module C# qui avait besoin de l'utiliser sans se soucier le moins du monde de l'interopérabilité. Sans faille. Le programmeur C# n'a jamais besoin de savoir.
Réduction du code La plupart des données introduites dans le moteur de calcul se présentaient sous la forme de vecteurs et de matrices. Les fonctions d'ordre supérieur les mangent pour le petit déjeuner avec un minimum d'agitation et de code. C'est beau.
Absence de bogues La programmation fonctionnelle peut sembler étrange. Je peux être en train de 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. C'est presque binaire, soit ça ne compile pas, soit c'est correct. Les erreurs bizarres sont minimisées, la récursion et les fonctions d'ordre supérieur éliminent une grande partie du code de comptabilité qui introduit des erreurs bizarres.
Parallélisme La pureté fonctionnelle de l'implémentation qui en résulte permet d'exploiter le parallélisme inhérent au traitement des vecteurs de données. C'est peut-être ce que je vais faire maintenant que .NET 4 est sorti.