Quelle méthodologie logicielle dois-je suivre lorsque je fais des recherches?

9

J'analyse généralement les données des expériences et bien que j'ai un schéma général des étapes que je dois faire, je pourrais avoir besoin de les ajuster aux spécificités des expériences ou aux questions sous-jacentes. Je suis généralement le seul à coder.

J'ai regardé wikipedia mais je ne sais pas quelle méthodologie je peux utiliser, en partie parce que je n'en ai jamais suivi, et en partie parce que j'explore parfois les données, pour voir à quoi elles ressemblent, et d'autres fois, je veux juste une réponse. (Et parce que je ne suis pas trop attendu pour tester ou avoir une certaine qualité sur mon code)

J'ai été invité à poser cette question après une heure ou deux en découvrant que la fonction r tabledépend de l'ordre des vecteurs et non du nom des éléments auxquels les comparer. Ensuite, je pensais que j'aurais dû tester le comportement et les fonctions où j'ai utilisé avec des données fictives. Mais j'ai utilisé le tableau après que d'autres analyses aient entraîné un manque d'informations, donc je n'aurais pas pu suivre la méthodologie de développement pilotée par les tests (si j'avais bien compris). Cependant, je pense qu'avec une certaine amélioration de la façon dont je fais face au projet, je pourrais être plus efficace, en plus de détecter les erreurs plus tôt, mais aussi comment et quoi rechercher en cas de doute sur un résultat, alors veuillez ne pas vous concentrer uniquement sur cet exemple d'erreur.

Quelle méthodologie logicielle convient le mieux à la recherche?

Je demande essentiellement comment garantir la qualité et les progrès dans le temps ainsi que conserver la spécificité de la recherche.

Exemple de fonctionnement:

Un biologiste a en tête une question et sait que faire une expérience conduira à avoir des données d'intérêt (c'est-à-dire des niveaux d'expressions géniques dans deux conditions), puis il / elle a défini l'expérience et recueilli des échantillons de 10 personnes / souris / rats. Maintenant, je dois analyser ces données pour ces 10 échantillons en utilisant les bibliothèques et tests existants (ou en implémentant de nouveaux tests) mais en tenant compte de la question que le biologiste avait en tête (c'est-à-dire quels gènes sont plus exprimés dans une condition que dans d'autres). La structure est la même que dans les expériences précédentes (qui impliquaient 6 conditions et un autre animal) mais le test statistique, les normalisations, la structure des données peuvent changer. J'ai donc l'habitude de copier une version précédente et de l'adapter aux besoins actuels.

llrs
la source
7
ce que tu es maintenant va bien. Aucune méthodologie ne vous empêchera de faire des erreurs! assurez-vous simplement d'utiliser un système de contrôle de version et de bien organiser vos bases de code.
gbjbaanb
Aucune méthodologie n'empêchera les erreurs. Mais certains rattraperont les erreurs plus tôt! Conception par contrat ou conception basée sur un contrat.
Frank Hileman
Pourriez-vous élaborer votre dernière phrase? Je ne l'ai pas du tout compris.
llrs
peut-être en.wikipedia.org/wiki/Test-driven_development avec une sorte de cadre de test automatisé - de petits tests sont utiles pour attraper des bogues et des tests plus grands peuvent correspondre (grossièrement) à vos hypothèses
david.libremone
1
@Llopis idéalement, vous écrivez un test en premier, il échoue, puis vous écrivez le code, le test réussit, puis vous validez votre code - si vous découvrez un bogue plus tard sur la ligne, vous écrivez le test qui aurait détecté le bogue, il échoue , corrigez le code, le test réussit, puis vous validez votre code - vous ne pouvez pas tout prévoir, mais vous pouvez vous assurer que la même chose ne se reproduise plus
david.libremone

Réponses:

6

Ce qui est nécessaire n'est peut-être pas une méthodologie logicielle, mais un changement politique dans le monde universitaire qui résout le problème du manque de reconnaissance du rôle joué par le développement de logiciels dans le domaine scientifique.

Le Software Sustainability Institute (UK) est l'organisation la plus proche de ce que vous recherchez: comment plaider pour une utilisation plus consciencieuse de la programmation informatique dans la recherche scientifique.

Il fournit également des pointeurs d'information pour ceux qui s'intéressent aux méthodologies de développement logiciel.

Cependant, je dois souligner que les méthodologies régissent généralement les équipes de programmeurs de logiciels, avec des itérations et un raffinement progressif des objectifs du projet, et fonctionnent avec des bases de code stables qui durent longtemps. Ils concernent des projets qui sont des ordres de grandeur plus complexes que ce que vous faites.


Quant à savoir pourquoi cette chose très clairement correcte (utilisation plus consciencieuse de la programmation informatique dans la recherche scientifique) n'a pas été accomplie et toujours confirmée, voici la vérité qui dérange: dans les environnements administratifs académiques, les scientifiques peuvent être vus dégrader l'importance jouée par l'ordinateur programmation. Parfois, on peut les voir se regrouper pour nier la reconnaissance des contributions des personnes impliquées dans le logiciel, même si la nature de cette contribution s'inscrit dans la discipline scientifique.


Sur votre lieu de travail, il y a des choses qui manquaient et des choses que vous pouvez faire.

Les choses qui manquaient:

  • Manque de directives
  • Manque de supervision ou personne pour poser des questions
  • Manque de mentors ou de programmeurs informatiques qui connaissent les outils que vous utilisez (par exemple R)
  • Manque de réutilisation, d'archivage, de contrôle de version ou de documentation des logiciels développés précédemment, à des fins de répétabilité et d'apprentissage

En bref, la culture générale est que les personnes concernées ne sont pas vraiment intéressées par ... vous l'avez deviné ... une utilisation plus consciencieuse de la programmation informatique dans la recherche scientifique.


Choses que vous pouvez faire:

  • Consacrez plus de temps à l'apprentissage de vos outils.
    • Passez plus de temps à lire la documentation et les exemples de code pour vos langages de programmation
    • Vous devrez apprendre à aimer les outils que vous utilisez.
  • Essayez d'écrire quelque chose, au profit du prochain programmeur informatique qui sera asservi au même groupe de personnes pour les deux prochaines années
    • Un wiki sera excellent.
  • Essayez de configurer le contrôle de version source
    • Être en mesure de récupérer des extraits de code couramment réutilisés
    • Être capable d'enregistrer un instantané du code utilisé dans une expérience particulière

Pour les développeurs de logiciels de carrière, des directives de cette nature peuvent être trouvées dans:

Ceux-ci sont considérés comme les exigences de base pour gérer une entreprise de développement de logiciels. Cependant, lorsque vous menez une guerre d'apathie, seul, vous devez établir des priorités. Améliorer les outils, noter et maintenir les informations, conserver les versions du code source sont le strict minimum pour un environnement unique.

rwong
la source
Ressource intéressante sur le Software Sustainability Institute merci! J'écrirai mes propres directives sur le code et la gestion des données, j'ai un superviseur mais il ne semble pas avoir "la connaissance des outils", j'utilise git, mais j'essaierai de suivre vos conseils sur la documentation
llrs
ha oui, un wiki ... pour en avoir essayé quelques-uns, je recommanderais dokuwiki.org/dokuwiki# ici. Simple à configurer et conserve les documents sous forme de fichiers texte plutôt que dans une base de données. J'ai trouvé que c'était le meilleur équilibre entre la facilité de configuration, la facilité d'utilisation et la durabilité des données.
Newtopian
Les problèmes de science assistée par ordinateur décrits par @rwong sont présents dans la plupart des instituts dans lesquels j'ai travaillé (physique et astronomie)
steffen
2

Ne vous embêtez pas tant sur la méthodologie mais essayez de vous concentrer davantage sur ce dont vous avez besoin pour garder une trace de vos besoins pour le développement logiciel lui-même.

Ayant effectué un court séjour dans une position relativement similaire à la vôtre, voici ce que je peux extraire de mon expérience personnelle.

Exactitude algorithmique

Probablement l'aspect le plus important, vous devriez pouvoir prouver que votre logiciel fait ce pour quoi il a été conçu. Ici, les tests automatisés sont votre meilleur allié. Je me rends compte qu'il peut être difficile de se passer d'un ensemble de données approprié, mais en fait, vous devriez prendre l'habitude de créer vos propres ensembles de données. Leur objectif est cependant quelque peu différent, vous n'essayez pas d'extraire la tendance des données mais assurez-vous que le logiciel produit des résultats prévisibles et corrects à partir d'un ensemble de données connu. Ainsi, pour la reconnaissance des formes, par exemple, vous n'avez pas besoin d'une composition génétique multi-gig, quelques lignes de texte suffisent pour garantir que l'algorithme détecte la forme.

J'avais l'habitude de créer mes données pour représenter des cas d'angle, des cas impossibles. J'avais tendance à me concentrer davantage sur les extrêmes que sur la norme attendue. Plusieurs fois, je me souviens avoir testé quelque chose d'impossible uniquement pour voir cette situation se produire dans l'ensemble de données réel. Si je ne l'avais pas testé, je n'aurais pas mis en place les détections d'erreurs et l'enregistrement nécessaires pour identifier les corruptions ou erreurs potentielles dans l'ensemble de données. TDD est un bon ajustement pour cette partie, bien que la création d'un bon ensemble de tests soit, je pense, plus importante, que vous le fassiez avant ou après le code réel.

Versioning

Trop souvent, cette partie est omise. Un bon schéma de version pour votre code et les packages / exécutables produits vous aidera énormément à maintenir votre progression dans l'ordre. Être capable de récupérer exactement le code qui a été utilisé pour créer les résultats précédemment obtenus peut aider lors du suivi des bogues ou des écarts. La ramification peut également aider lors de l'expérimentation de différentes approches ou algorithmes.

Assurez-vous de baliser le code utilisé dans les calculs réels, consultez la version sémantique si vous avez besoin d'aide pour nommer les versions.

Construction automatisée

Un corollaire au point ci-dessus. Assurez-vous d'automatiser autant que possible le processus de construction et d'empaquetage de votre logiciel. Vous n'avez pas besoin de passer au complet, juste assez pour rendre trivial la création du système final à partir des sources et des dépendances. Le but ici est de vous faire gagner du temps mais aussi d'avoir un moyen reproductible pour recréer le logiciel à partir de la source, y compris les dépendances et autres externes. Groovy, Maven, ant, Scons, cmake, ne sont qu'un petit échantillon d'outils d'automatisation de construction et de systèmes de script qui peuvent vous aider.

Si vous voulez aller plus loin, installez Jenkins ou teamcity ou tout autre système d'intégration continue. Bonus supplémentaire si vous devez maintenir plusieurs serveurs ou travailleurs pour l'informatique distribuée. La plupart de ces systèmes auront des moyens d'aider à la maintenance. De plus, vous serez en mesure d'automatiser complètement les exécutions de test afin que vous n'ayez pas besoin d'attendre les résultats avant de continuer, validez et recevez un courrier plus tard. J'ai eu un système qui a mis des heures à passer les tests. Mettre en place cette automatisation a été le meilleur investissement de mon temps. Surtout si vous avez déjà les scripts en place pour tout construire.

Isolement de l'environnement

Les chercheurs passent énormément de temps à isoler un ou plusieurs petits ensembles de variables d'intérêt de systèmes complexes par le biais de leurs protocoles. Cela devrait également être étendu à vos pratiques de développement logiciel. Vous pouvez également vérifier la conteneurisation avec Docker ou Vagrant. Il vous donnera un meilleur contrôle sur l'environnement dans lequel le logiciel est exécuté.

Vous n'avez pas besoin d'avoir une grande équipe avant que cela porte ses fruits, j'étais la plupart du temps seul mais j'ai grandement profité de leur mise en place. La tranquillité d'esprit et le gain de temps que cela m'apportait dépassaient de loin les frais généraux que cela m'avait coûté.

Newtopian
la source
J'ai généralement laissé le code tel quel lorsque j'en ai fini, donc la dernière version est celle utilisée pour les calculs, donc je devrais peut-être l'améliorer. Aussi sur l'exactitude algorithmique, ne devrais-je pas supposer que les bibliothèques que j'utilise fonctionnent correctement?
llrs
vous pouvez, bien que j'aie déjà fait des tests sur des dépendances externes mais c'était rare ... c'est votre propre code que vous devriez tester, avez-vous utilisé les bibliothèques correctement? Échoue-t-il de manière réductible (votre code)? etc.
Newtopian
0
  1. Pouvez-vous utiliser R? C'est pour ça.

  2. Gardez votre code simple . Optez pour la lisibilité et ne vous inquiétez pas des performances, sauf en cas de problème. Des méthodologies existent pour essayer d'empêcher les équipes de programmeurs de se mettre des bogues dans le code de l'autre, même si l'équipe est une seule personne.

  3. Cela dit, la discipline du codage est super importante. J'ai vu du code de scientifiques et de mathématiciens avancés hautement qualifiés, et c'est affreux . Ils ignorent totalement le formatage. Ils écrasent le code ensemble comme s'il était emballé sous vide. Leurs noms de variables sont totalement mystifiants. Ils n'écrivent pas de commentaires, ou ils écrivent des commentaires impénétrables, ou les commentaires disent une chose tandis que le code en dit une autre. Ne fais pas ces choses. Pensez toujours à l'avance aux changements futurs que vous ou d'autres pourriez devoir apporter.

Mike Dunlavey
la source
1
J'utilise R, j'espère que mon code est assez simple pour repérer les bugs que j'aurais pu écrire et toute erreur que j'aurais pu faire. Je respecte le style de mise en forme du code Google R et j'aimerais penser que les commentaires sont utiles pour expliquer pourquoi je prends de telles décisions dans le code.
llrs
@Llopis: Alors je dirais que vous êtes sur la bonne voie.
Mike Dunlavey
@Llopis dans le développement de logiciels en équipe, il est courant pour les membres de l'équipe de demander à un autre d'examiner le code, en supposant que plus d'yeux peuvent attraper plus d'erreurs. Malheureusement, dans votre situation, il n'y a personne pour réviser le vôtre, et la culture du secret dans la recherche vous aura empêché de laisser d'autres personnes (en dehors de vos autorisations de travail) réviser votre code.
rwong
1
@rwong en fait, j'ai maintenant le droit de partager mon code de recherche, donc n'importe qui pourrait le consulter sur github
llrs
@Llopis: Raison de plus pour le rendre lisible. Une chose que j'essaie de faire est de donner un très petit tutoriel (dans les commentaires) sur le sujet, car les chances sont que l'expertise du lecteur sera différente de la mienne.
Mike Dunlavey