Est-il courant de ne pas utiliser de bibliothèques pour des algorithmes numériques standard, et pourquoi?

54

De nombreux algorithmes numériques (intégration, différenciation, interpolation, fonctions spéciales, etc.) sont disponibles dans des bibliothèques de calcul scientifiques telles que GSL . Mais je vois souvent du code avec des implémentations "roulées à la main" de ces fonctions. Pour les petits programmes qui ne sont pas nécessairement destinés à une distribution publique, est-ce une pratique courante parmi les scientifiques en informatique de simplement mettre en œuvre vous-même des algorithmes numériques (par exemple, copier ou transcrire à partir d'un site Web, de Recettes numériques, ou d'un logiciel similaire) lorsque vous en avez besoin? Si tel est le cas, existe-t-il une raison particulière d' éviter de créer un lien avec GSL ou s'agit-il simplement d'une "tradition"?

Je le demande parce que je suis un grand partisan de la réutilisation du code , ce qui me suggèrerait d'essayer d'utiliser les implémentations existantes lorsque cela est possible. Mais je suis curieux de savoir s’il existe des raisons pour lesquelles ce principe a moins de valeur dans le calcul scientifique que dans la programmation générale.


Oubli de mentionner: je parle spécifiquement de C et C ++, par opposition à des langages tels que Python où l’utilisation d’une bibliothèque présente un avantage évident (vitesse d’exécution).

David Z
la source
14
D'une part, vous ne voudriez pas réinventer la roue. D'autre part, le meilleur moyen de comprendre un algorithme (et par extension, de diagnostiquer facilement les cas où cet algorithme échoue de manière spectaculaire) est de tenter de coder vous-même une implémentation.
JM
2
Est-ce que vous reprenez tous les théorèmes que vous rencontrez? Vous pouvez peut-être tenter votre chance et jouer avec des cas de bébés, mais à moins que ce ne soit le but de vos recherches, vous l'acceptez probablement et vous passez à autre chose.
dls
3
Les physiciens ne sont pas des programmeurs et ne sont pas habitués à traiter avec le code d'autrui (le lire ou le corriger). Lorsqu'ils doivent utiliser le code d'autres personnes, ce n'est souvent pas un code très bien écrit ou commenté écrit par d'autres physiciens, ce qui ajoute encore à l'idée qu'il est préférable de le réécrire plutôt que de le réutiliser. Cela est vrai au moins dans certains domaines / communautés, mais les attitudes changent chez les jeunes. Ce n'est pas si mal cependant, pensez à l'attitude du mauvais élève du CS qui ne peut rien faire s'il ne trouve pas une bibliothèque assez facile à utiliser.
Szabolcs

Réponses:

45

J'avais l'habitude de tout mettre en œuvre moi-même, mais j'ai récemment commencé à utiliser beaucoup plus de bibliothèques. Je pense que l’utilisation d’une bibliothèque présente plusieurs avantages très importants, au-delà de la simple question de savoir si vous devez écrire une routine vous-même ou non. Si vous utilisez une bibliothèque, vous obtenez

  • Code qui a été testé par des centaines / milliers / utilisateurs
  • Code qui continuera à être mis à jour et amélioré à l'avenir, sans aucun travail de votre part
  • Code optimisé plus efficace et peut-être plus évolutif que ce que vous écririez lors d'une première tentative
  • En fonction de la bibliothèque, en établissant une interface avec celle-ci dans votre code, vous pouvez accéder à de nombreux algorithmes que vous n'utilisez pas actuellement mais que vous souhaitez utiliser ultérieurement.

Au dernier point ci-dessus, je pense aux grandes bibliothèques comme Trilinos ou PETSc . Je peux renforcer ceci avec quelques exemples personnels concrets dans le développement de PyClaw . Bien qu'il aurait été simple de mettre en parallèle Clawpack et les appels MPI, nous avons choisi d'utiliser PETSc. Cela nous a permis de limiter le code parallèle dans le package à moins de 300 lignes de Python. Mieux encore, en plaçant nos données au format PETSc, nous avons immédiatement accès aux solveurs implicites de PETSc, ce qui permet de travailler actuellement sur un solveur implicite dans PyClaw. Comme second exemple, PyClaw a initialement inclus la reconstruction WENO de cinquième ordre à code manuel, mais nous avons finalement décidé de nous en remettre à PyWENO.forfait pour cela. Cela a été un gain énorme, car PyWENO peut générer automatiquement des routines WENO de n'importe quel ordre dans plusieurs langues.

Enfin, si vous utilisez des bibliothèques, vous pouvez contribuer en développant des améliorations ou en trouvant des bogues, ce qui profitera à de nombreuses autres personnes, alors que le débogage ou l'amélioration de votre propre code ne vous est que bénéfique.

David Ketcheson
la source
5
"Vous pouvez contribuer en développant des améliorations ou en trouvant des bogues, ce qui profitera à beaucoup d'autres personnes." - cela satisferait à la fois le besoin de "bricoler / apprendre" et la paresse (ne pas avoir à faire des choses déjà faites). :)
JM
1
Voir aussi, les cas de bord. Pour de nombreux algorithmes, il est trivial d'implémenter quelque chose qui "fonctionne", mais ne gère pas correctement une infime fraction de cas. Cela peut convenir pour un petit projet ponctuel, mais je ne peux pas compter le nombre de fois où j'ai été happé par une maladie pathologique sur quelque chose que je me suis "optimisé" moi-même.
Meawoppl
34

La charge de programmation liée à la liaison avec une fonction de bibliothèque représente une surcharge importante pour le programmeur, en particulier si cette bibliothèque est nouvelle pour le programmeur. Il est souvent plus simple de simplement réécrire des algorithmes simples plutôt que de déterminer les spécificités d'une bibliothèque particulière. Au fur et à mesure que les algorithmes deviennent plus complexes, ce comportement change.

Python a excellé à réduire cette surcharge avec des outils tels que pip / easy_install et une interface de structure de données uniforme (chaque bibliothèque semble prendre et produire un tableau numpy).

MRocklin
la source
19

L’un des projets auxquels je participe actuellement est la rédaction d’un logiciel de simulation et d’analyse flexible pour une classe de détecteurs de la physique des particules. L'un des objectifs de ce projet est de fournir la base de code à utiliser dans ces domaines pour les décennies à venir.

À ce stade, nous avons déjà deux douzaines de dépendances, ce qui fait du processus de construction un tel cauchemar qu'il a créé un projet distinct géré par le centre de calcul Fermilab uniquement pour fournir une chaîne d'outils fiable.

Maintenant, imaginez que vous rencontriez un besoin pour un outil qui ne fait pas partie de cette chaîne d’outils (m’est arrivé le mois dernier). Vous avez trois choix

  1. Rouler vous possédez. Avec tous les risques et les tracas que cela implique.
  2. Grattez du code d’une bibliothèque quelque part et incluez-le dans le projet. Cela signifie que vous devez effectuer la maintenance et que vous devez comprendre le code de quelqu'un d'autre lorsque cela se produit.
  3. Allez voir les personnes qui entretiennent la chaîne d’outils, demandez-leur ce dont vous avez besoin, puis attendez un cycle de publication pour l’obtenir. Ces gars-là sont assez réactifs, mais vous devez en faire la preuve sans code fonctionnel ou après que vous ayez terminé (1) ou (2).

C'est très facile de choisir (1). Peut-être trop facile.

dmckee
la source
Oui, les dépendances ajoutées constituent un inconvénient majeur de l’utilisation des bibliothèques.
David Ketcheson
Les dépendances sont également le gros inconvénient dans mon esprit
Fomite
2
Il est possible que ma réponse mette trop de poids sur le fait des dépendances et pas assez sur le processus bureaucratique consistant à faire approuver des dépendances et à les installer dans de grands projets.
dmckee
* votre dans le point 3. (Désolé pour le nitpick.)
299792458
Euh non. Cela dit ce que je veux dire.
dmckee
12

Je pense qu'il est assez fréquent, avec des algorithmes plus susceptibles d'être réimplémenté que d' autres.

Il y a un compromis délicat à trouver entre l'installation gênante d'une bibliothèque, la difficulté d'implémentation de l'algorithme vous-même, sa difficulté à l'optimiser et le degré d'adaptation de la bibliothèque à vos besoins. De plus, utiliser une bibliothèque est parfois exagéré: j'ai utilisé l'algorithme de bissection lente dans l'un de mes programmes car je ne l'ai appelé que quelques fois et je ne voulais pas ajouter de bibliothèque uniquement pour cela.

Est-il facile pour vous d'écrire une version bien optimisée? Si c'est le cas, vous feriez mieux de le faire. Vous obtiendrez exactement ce dont vous avez besoin et vous ne dépendez du travail de personne. Mais bien sûr, vous devez vraiment savoir ce que vous faites: même des algorithmes simples peuvent être difficiles à implémenter.

Je serais curieux de voir une étude à ce sujet, mais de mon point de vue biaisé, les scientifiques utilisent souvent des bibliothèques pour l’algèbre linéaire et les générateurs de nombres aléatoires, la plupart du code restant étant fait maison.

PhDP
la source
12
"Mais bien sûr, vous devez vraiment savoir ce que vous faites: même des algorithmes simples peuvent être difficiles à implémenter." - cela ne peut pas être assez souligné.
JM
10

Je pense que la mise en œuvre d'un algorithme au lieu d'utiliser une bibliothèque peut parfois donner une meilleure compréhension et un meilleur contrôle du modèle. Lorsque je code un programme pour des calculs scientifiques, il est important que je comprenne ce que je fais. L'implémentation des algorithmes importants m'aide à mieux connaître le problème et à mieux le contrôler.

D’autre part, il n’est parfois pas facile de sélectionner une bibliothèque nécessaire à l’obtention d’une solution. Il est donc préférable de rechercher des algorithmes déjà implémentés lorsque vous êtes certain de ce que vous essayez d’atteindre et pourquoi vous le souhaitez.

Si les algorithmes sont complexes, leur codage à la main vous permet d’améliorer les performances / la qualité de la solution à l’aide de fonctionnalités spécifiques à une tâche. Et parfois, il est nécessaire de modifier légèrement l’algorithme, ce qui est plus facile si vous connaissez le code que vous avez écrit et que vous pouvez le modifier comme vous le souhaitez.

gmk
la source
1
+1 pour améliorer la compréhension. Bien que ce soit plus un problème pour vos propres algorithmes que pour une routine de bibliothèque.
Faheem Mitha
8

Une réponse est qu'il existe tellement de légères variations dans le code numérique qu'il est vraiment difficile de l'intégrer dans une bibliothèque. Comparez cela au logiciel Web, qui est souvent facile à installer et dispose d’un ensemble clair d’entrées et de sorties. Je pense qu'il est plus courant que des personnes s'emparent d'un framework ou d'une grande bibliothèque agissant comme un framework (Trilinos / PETSc) et utilisent cet écosystème pour tirer parti des codes de communauté.

aterrel
la source
7

Avant de décider d'utiliser ou non des bibliothèques, je pense que vous voudriez également savoir à quel point l'utilisation d'une bibliothèque aidera votre code. Si vous allez utiliser une bibliothèque bien optimisée pour un noyau de calcul clé, alors c'est probablement beaucoup plus efficace que d'essayer d'écrire votre propre noyau.

Cependant, si vous écrivez une routine spécialisée qui ne sera appelée qu'une fois pendant l'exécution d'un programme, il ne vaut peut-être pas la peine d'adapter votre code pour l'adapter au cadre requis par une bibliothèque.

(Une autre chose à considérer: combien de réarchitecture devrez-vous faire pour tirer parti de la bibliothèque? À moins que les heures de travail que vous passez à corriger le code ne soient compensées par des gains correspondants d'efficacité ou de précision numérique, il est possible que Cependant, idéalement, c’est ce que vous envisagez de faire lors de la conception initiale de structures de données et d’algorithmes, de sorte que le "flux" de la bibliothèque soit pris en compte à partir de la base.)

aeismail
la source
6

Mes 2 centimes

Je pense qu'il est plus facile d'écrire de manière générale à ce sujet, plutôt que de parler de C / C ++. Premièrement, les bibliothèques dans des langages tels que Python ne sont pas nécessairement utilisées pour obtenir un avantage en termes de vitesse, même si cela est une conséquence. Je pense que @David a assez bien expliqué les raisons.

En partant du haut, l'implémentation du langage dicte dans une certaine mesure les bibliothèques auxquelles vous avez accès. Les langages couramment utilisés en informatique comprennent C, C ++, Python, Perl, Java, Fortran et R. Des exemples moins courants pourraient être Ocaml et Common Lisp. Maintenant, puisque la plupart de ces langages sont écrits en C, ils ont une interface de fonction étrangère naturelle avec C. Cependant, il n’est pas si facile d’appeler, par exemple, une bibliothèque Perl de Python ou inversement. Donc, dans la pratique, les gens ont tendance à

  1. Utiliser une bibliothèque écrite dans leur langage d'implémentation, généralement quelque chose qui fait partie des bibliothèques standard, ou qui est par ailleurs largement disponible, ou

  2. Appelez une bibliothèque C / C ++ via les langages FFI. Cela suppose qu’une enveloppe n’existe pas déjà, car si elle existe, elle ne se distingue pas facilement de (1).

(2) est généralement plus difficile, car vous devez envelopper vous-même la fonction C / C ++. En outre, vous devez regrouper la bibliothèque ou ajouter une dépendance supplémentaire. Pour cette raison, les gens sont plus susceptibles d’utiliser les bibliothèques de langues intégrées plutôt que GSL par exemple, qui est en C.

Pour les routines très génériques, par exemple pour générer des échantillons aléatoires à partir de distributions, ou des routines numériques de base telles que la quadrature des intégrales, il est facile et courant de réutiliser une bibliothèque. À mesure que la fonctionnalité que l'on essaie d'implémenter devient plus complexe, il devient de plus en plus improbable que l'on trouve la fonction exacte souhaitée dans une autre bibliothèque, et même celle-ci, on pourrait passer beaucoup de temps à chercher et à adapter la fonction nécessaire (le style / la conception du code pourrait par exemple poser problème). Et comme discuté ci-dessus, on n'a accès qu'à un sous-ensemble des bibliothèques existantes. D'autre part, implémenter soi-même un algorithme s'il est complexe et non l'objectif principal peut être décourageant, et bien sûr, il faut gérer ces problèmes de vitesse embêtants.

Cela devient donc un problème d'optimisation dans l'analyse coûts / avantages. Mon expérience est que même pour des techniques relativement standard comme MCMC, je finis généralement par écrire mon propre code, car cela correspond mieux à la façon dont je conçois le logiciel dans son ensemble.

Bien sûr, même si vous n'utilisez pas le code, il est possible d'apprendre du code des autres. Cependant, je ne sais pas à quelle fréquence les scientifiques se donnent la peine de le faire. Mon impression est que lire le code des autres pour apprendre est davantage une affaire d'ingénieur en logiciel.

Faheem Mitha
la source
6

En repensant à mon cours de mécanique de deuxième année, je me rends compte qu'une partie de la raison pour laquelle j'ai implémenté mes propres versions d'algorithmes bien connus est que j'ai appris à le faire de cette façon. Je ne peux pas penser à un seul exemple où on m'a appris à établir une interface avec une bibliothèque dans ma formation de physique de premier cycle. Je me souviens très bien d'avoir vu pour la première fois une liste des coordonnées d'une balle de golf en rotation, après avoir calculé moi-même la solution des équations de Newton couplées. Il y a un certain frisson et une certaine satisfaction (voire une fierté) à calculer les choses à partir de zéro.

JxB
la source
1
C'est certainement un facteur. Et cette focalisation sur le faire soi-même est nécessaire pour une partie de la formation d'un scientifique en informatique. Les programmeurs purs finissent par le perdre, mais les scientifiques peuvent passer directement de cette salle d’introduction à une projection peuplée presque exclusivement d’autres personnes ayant emprunté le même chemin.
dmckee
5

Je pense qu'on devrait utiliser autant que possible des bibliothèques testées. La plupart des gens ne sont pas des experts en informatique numérique et ne seront probablement pas en mesure de mettre en œuvre une solution aussi correctement et avec autant de soin que ce qui est disponible dans des bibliothèques bien testées. Cela dit, il arrive parfois qu’aucune bibliothèque disponible ne mette en oeuvre la combinaison de fonctionnalités requise dans une application donnée. J'ai vu cela se produire dans le domaine technique dans lequel je travaille; Les codes existants ne résolvaient pas tous les cas et quelqu'un finissait par implémenter un solveur à partir de rien.

Mhucka
la source
1
Si la bibliothèque ne couvre pas tous vos besoins, je vous recommande d'étendre le code de la bibliothèque et de soumettre un correctif. De cette façon, votre travail profitera à beaucoup d’autres, et d’autres testeront également votre code pour vous. Bien entendu, cela suppose que le code de la bibliothèque a été écrit de manière suffisamment souple pour pouvoir être étendu pour répondre à vos besoins.
David Ketcheson
Je conviens que c'est une excellente solution et que les gens devraient faire quelque chose de possible.
Mhucka
5

Le problème fondamental est souvent lié à l'interface entre l'application et la bibliothèque. Un programmeur d'application a connaissance du problème qui est souvent perdu lors de la transmission du problème (par exemple sous forme de matrice) à une bibliothèque. Cette connaissance est telle que son exploitation dépasse largement les avantages de l’utilisation de la bibliothèque hautement optimisée. En conséquence, le programmeur d'application "lance" sa propre implémentation qui exploite les connaissances.

Ainsi, une très bonne bibliothèque a besoin que de telles connaissances soient transmises de l'application à la bibliothèque, de sorte que la bibliothèque aussi puisse en tirer parti.

Robert van de Geijn
la source
3

En plus de tout ce qui a déjà été dit ci-dessus, je vais répéter ma réponse à la question "Fortran vs C ++": L'atout le plus précieux d'un programmeur est son temps. Oui, les dépendances externes sont souvent gênantes. Mais passer du temps à ré-implémenter, déboguer et tester des algorithmes déjà mis en place par les autres algorithmes est presque toujours stupide, et le résultat sera rarement aussi bon que le code écrit par des experts sur un sujet particulier. Réutilisez ce que d'autres ont fait!

Wolfgang Bangerth
la source
Je donne ma propre réponse sur ce sujet. Vous pouvez en apprendre beaucoup plus lorsque vous ré-écrivez tous les détails. Je travaille depuis 5-6 ans avec les nuages ​​de points maintenant. Les trois premières années, j’ai moi-même écrit toutes les fonctionnalités. La seconde moitié, j'ai passé à utiliser la bibliothèque de nuages ​​de points. Je ne peux pas le prouver, mais je me considère comme un expert plus fort en PCL en passant les trois premières années à réfléchir à des solutions déjà proposées par d’autres.
Jan Hackenberg
@JanHackenberg - oui, mais permettez-moi d'être franc: vous venez de perdre trois ans de votre vie à réinventer les roues. Imaginez combien de choses nouvelles vous auriez pu faire si vous aviez utilisé ce que d’autres ont fait!?
Wolfgang Bangerth
J'ai décidé d'écrire en Java dès ma première année d'études car à ce moment-là, mes compétences en programmation (et non en théorie de l'informatique) étaient proches de zéro. Java était toujours la langue dans laquelle j'étais le mieux en pratique. J'ai également considéré Java comme un bon choix en raison de la facilité de prise en charge multi-plateformes. Je suis entré dans une chaire sans support informatique dans le doctorat (foresterie traditionnelle). J'ai sauté à c ++ quand j'ai réalisé mon erreur et j'ai pu (après publication, pas avant).
Jan Hackenberg
BTW, je ne suis pas d'accord pour prolonger 3 ans de ma vie. Cela signifierait que je n'avais que deux années utiles en expérience postdoctorale de doctorat. Aujourd'hui, je peux placer 10 milliards de cylindres dans un nuage de points forestier et laisser la machine choisir ceux qui représentent le mieux les arbres. Mes ~ 50 utilisateurs peuvent également le faire. Dans ~ 1 heure. Toutes les astuces que j'ai apprises en apprenant de manière dure et chronophage. J'ai décidé de ne jamais apprendre à utiliser vi, mais lorsque les utilisateurs réussissent la courbe d'apprentissage requise, ils prétendent utiliser le moyen le plus efficace pour produire du code, je les crois.
Jan Hackenberg
2

Le groupe avec lequel je travaille utilise le plus possible les bibliothèques. Je suis l'un des rares programmeurs, et le reste des gens s'est intéressé à la programmation au travail. Ils en savent assez sur leurs propres limites pour savoir où ils ne devraient pas frotter. IMSL est la bibliothèque préférée. Des choses comme GSL seraient interdites en raison de restrictions de licence, même s'il s'agit d'une agence fédérale et que nous cédons nos logiciels quand même.

Tangurena
la source
2

"La réutilisation est avant tout un phénomène social. Je peux utiliser le logiciel de quelqu'un d'autre à condition

  1. Ça marche
  2. c'est compréhensible
  3. ça peut coexister
  4. il est pris en charge (ou je suis prêt à le faire moi-même, surtout pas)
  5. c'est économique
  6. Je peux le trouver.

"- B. Stroustrup, Édition du langage de programmation C ++ 2 (1991) p. 383.


la source
1

Plusieurs bonnes raisons ont été données par d’autres d’utiliser des bibliothèques et de lancer leurs propres routines.

Vous pouvez parfois accélérer les calculs pour une application spécifique parce que vous savez à l'avance que vous n'aurez jamais besoin de la vaste gamme de valeurs que couvre la routine de bibliothèque ou de la précision fournie par ces routines.

Bien sûr, beaucoup dépend de l'application en question et du nombre de fois où la routine de bibliothèque sera appelée. Pourquoi voudriez-vous appeler une routine de bibliothèque pour les fonctions Bessel des milliards de fois si vous n'avez besoin que de quelques chiffres significatifs pour une petite plage de x et qu'une technique plus simple suffira à vos besoins?

Lysistrata
la source
0

Peu de chose à ajouter, nous devons réutiliser le code, il en va de la durabilité du code et de sa contribution à la société, mais c’est tout.

La raison pour laquelle nous ne réutilisons pas le code est que si vous commencez à programmer, il est difficile de comprendre le code des autres. C'est particulièrement difficile avec le C ++ avancé, et vous pouvez aussi faire quelques astuces en C pur.

Très souvent au début, on comprend la méthode, mais pas telle qu’elle est implémentée dans la bibliothèque, ou simplement comment utiliser la bibliothèque avec son interface générique, son contrôle des erreurs et ses conventions, très souvent documentées pour les programmeurs expérimentés. Cela donne l’illusion qu’il vaut mieux mettre en œuvre une méthode standard, telle que la factorisation de LU par vous-même. De plus, les nouveaux programmeurs sous-estiment la valeur des tests de code, de la validation et de la portabilité pour différents systèmes d'exploitation. Donc, à la fin, la paresse, écrire son propre code apparaît comme une solution plus rapide et plus simple.

La réalité est que nous pouvons apprendre davantage en utilisant et en lisant du code que de programmer par vous-même.

La paresse me conduit la plupart du temps, je pense aussi à la majorité des gens. Pour la même raison, certains écrivent du code à partir de rien et d'autres utilisent des bibliothèques existantes.

likask
la source
-1

Les algorithmes des bibliothèques fournissent par contraste avec leurs propres implémentations:

  • Ils sont génériques et basés sur des modèles. Vous pouvez ultérieurement reparamétrer votre implémentation sans vous soucier de changer votre propre code qui est supposé avoir beaucoup de contraintes.
  • Il existe des cas de sécurité par opposition à des cas dégénérés de données d'entrée. De nombreux algorithmes de géométrie de calcul, par exemple ceux à coque convexe, doivent par exemple gérer la colinéarité de trois points. Vous pourrez peut-être ignorer ces cas si vous ne prévoyez jamais de distribuer votre code et que vous ne voulez pas non plus le réutiliser à l'avenir.
  • Ils fournissent une complexité d'exécution minimale pour les configurations d'entrée attendues ou pires. Les algorithmes de niveau supérieur ont souvent comme briques de construction des algorithmes de niveau inférieur, tels que des algorithmes de tri ou des types de données spéciaux. Le tri rapide peut être le choix le plus courant pour le tri des données, mais si votre implémentation de l'algorithme doit garantir n (log (n)), vous ne pouvez pas l'utiliser.
  • Ils utilisent efficacement la mémoire
  • Ils sont en outre optimisés à l'exécution
  • Si cette option est prise en charge, elle est de loin plus "fermée", en particulier si vous travaillez avec la branche principale. Rien n'est plus testé qu'une bibliothèque bien distribuée. Tous les bogues ne tombent pas en panne, tous les bogues ne produisent pas des résultats déraisonnables. L'implémentation de votre algorithme peut toujours produire des résultats acceptables, mais pas aussi bons que prévu. Moins un bogue est visible, moins il est probable que vous puissiez le détecter en tant que personne seule.

Je considère toujours bon, lorsqu’on entre dans un nouveau domaine, d’implémenter soi-même une version d’un algorithme bien compréhensible. Je prend beaucoup de temps au total. J'ai acheté et lu des livres, la presse nommée et al. J'ai toujours lu beaucoup de théorie avant et pendant ces implémentations. Et après avoir compris les concepts généraux d'un domaine et avoir expérimenté les pièges dans la pratique, il est temps de passer rapidement à la meilleure implémentation de bibliothèque. Je pense que vous deviendrez un meilleur utilisateur de la bibliothèque si vous écriviez vous-même un algorithme "hello world" dans le champ des bibliothèques.

Si vous travaillez dans une équipe plus grande, le choix de votre équipe d'utiliser une bibliothèque spécifique peut ne pas être votre propre choix. L'équipe principale pourrait prendre la décision. Et il pourrait y avoir une personne responsable de la liaison de la bibliothèque dans votre projet avec ses propres plannings horaires. Réécrire un algorithme que vous pouvez faire avec votre propre planification, sans vous fier à la décision des autres.

Si vous êtes seul et aimez distribuer, il y a un autre problème. Je considère, ainsi que de nombreux autres codes sources, la ressource la plus utile. Beaucoup d’informaticiens pourraient être d’accord ici. Dans un domaine appliqué en dehors de l'informatique, il peut être nécessaire de fournir un exécutable précompilé sur Windows. Sous Linux, vous pouvez configurer les choses relativement facilement par vous-même dans le cas de bibliothèques d'utilisation open source.

Réécrire vous-même un algorithme donne la liberté de lecture. Votre projet pourrait ne pas prendre en charge la licence GPL de GSL par exemple.

La lecture pourrait être la seule contrainte indépendante du point de vue des chercheurs.

Jan Hackenberg
la source
1
Il est absurde de penser qu'implémenter soi-même un algorithme et apprendre la syntaxe d'une bibliothèque coûteraient le même temps. Ce n'est même pas vrai pour des fonctions simples telles que "strcat". Ce n'est certainement pas le cas pour tout ce qui est dans LAPACK, par exemple, ou dans des bibliothèques de niveau supérieur.
Wolfgang Bangerth
@ WolfgangBangerth Merci pour les commentaires. J'ai relu ce que j'ai écrit et je ne voulais pas transférer le message que les propres implémentations peuvent être compilables. Mais j'ai tellement appris. Mon "les deux pourrait coûter deux semaines" n'était pas un bon exemple. En fait, cela m'a coûté la dernière fois "d'apprendre la syntaxe" il y a deux semaines lorsque je suis passé de Java à C ++ et que j'ai également appris la syntaxe de base C ++ à ce moment-là. J'ai eu plus de difficultés avec Pointers qu'avec ma nouvelle bibliothèque. Deux des algorithmes mis en œuvre avaient peut-être été codés au bout de deux semaines, ce qui était mon investissement mineur (lire des livres auparavant prend beaucoup plus de temps).
Jan Hackenberg
L'investissement ne consiste pas à écrire un petit algorithme lui-même. C'est rapide et peut même parfois prendre aussi longtemps que l'apprentissage d'une autre bibliothèque. Ce qui coûte énormément de temps, c’est de déboguer des choses et de régler correctement tous les problèmes. Si vous utilisez une bibliothèque bien développée, vous savez que si le produit matrice-vecteur fonctionne pour les matrices carrées, il fonctionnera également pour les matrices rectangulaires. Pour votre propre logiciel, vous pouvez implémenter et déboguer ceci, même si vous pensiez en avoir fini avec la fonction. Vous reviendrez à la même fonction plusieurs fois. C'est ce qui coûte du temps.
Wolfgang Bangerth le
@ WolfgangBangerth Je suis d'accord avec tous vos arguments. Mon seul point est que vous apprenez beaucoup plus de théorie lorsque vous devez gérer vous-même ces cas Corner. Ma première version de ma réponse semblait en effet ne faire aucune différence. J'étais horriblement fatigué. J'écris dans la réponse améliorée beaucoup plus sur les avantages de stabilité des bibliothèques. Pour moi, c'est un compromis entre le temps passé et les connaissances acquises.
Jan Hackenberg