Comment programmez-vous efficacement quand il faut longtemps pour tester simplement votre code?

16

Mon flux de travail a toujours consisté à écrire une étape logique, puis à exécuter le programme et à inspecter la sortie. Ce processus m'a incroyablement bien servi pour des affectations à l'université. Cependant, comme je fais plus de développement, il y a souvent des moments où simplement compiler et exécuter votre code prend 1 à 2 minutes. Les exemples incluent le téléchargement d'un programme sur un microcontrôleur, nécessitant une interaction avec un serveur externe et incapable d'implémenter l'automatisation en raison de l'authentification, de l'architecture logicielle ou de la complexité.

Ces types de tâches ne conviennent pas à la façon dont je programme habituellement et j'ai des difficultés à coder efficacement. Je fais généralement beaucoup d'erreurs de syntaxe et d'erreurs logiques, dont la plupart sont facilement détectées par les tests. Cependant, avec un temps d'attente aussi long, cette méthode prend trop de temps.

Anne Nonimus
la source
Utilisez-vous un IDE?
Woot4Moo
3
Votre problème racine n'est pas incapable de coder efficacement, ce sont des tests qui prennent trop de temps à exécuter. Vous posez la mauvaise question.
Rein Henrichs
Utilisez un langage doté d'un REPL.
Robert Harvey
Avez-vous des collègues que vous pouvez demander et apprendre?
user985366

Réponses:

25

Tout d'abord, toute sorte de débogage interactif est excellente. Vous le souhaitez dans votre boîte à outils, car si ce n'est pas encore le cas, vous en tirerez un jour un réel avantage. (Les détails varient selon la langue, la plate-forme et l'IDE.)

nécessitant une interaction avec un serveur externe et incapable de mettre en œuvre l'automatisation en raison de l'authentification, de l'architecture logicielle ou de la complexité.

J'examinerais certains cadres pour utiliser des objets fictifs . Ceux-ci vous permettent d'entourer le composant testé avec un faux écosystème d'autres composants, afin que vos tests soient plus spécifiquement ciblés et que vous puissiez éviter de tout tester dans son ensemble.

De plus, les objets fictifs eux-mêmes peuvent être programmés avec des assertions, vous pouvez donc vérifier que le composant en cours de test a vraiment effectué un certain appel.

Darien
la source
12

Je travaillerais dur pour réduire le temps de test. J'avais travaillé dans quelques sociétés développant du code intégré, et les tests étaient pénibles, nécessitant des déplacements dans la salle des serveurs et des FTP et redémarrages manuels et plusieurs commandes sur le matériel de test. Ensuite, j'ai rejoint un très bon groupe, où je pouvais simplement taper «make test» à mon bureau et obtenir des résultats en moins d'une minute. Dans cette minute:

  • Mon code a été intégré dans une nouvelle image du noyau pour le matériel embarqué.
  • Le serveur DHCP a été mis à jour pour pointer vers le nouveau noyau.
  • La carte de test a été redémarrée.
  • La carte de test a récupéré le noyau de mon poste de travail via un montage NFS.
  • La carte de test a redémarré sur le nouveau noyau.
  • Les tests unitaires ont été exécutés.
  • La sortie de test unitaire a été renvoyée sur mon poste de travail.

Il a fallu un certain temps pour que tout cela fonctionne, mais l'effort d'automatiser toutes ces étapes a été amorti au centuple à mesure que le personnel de développement augmentait.

Kevin Cline
la source
2
+1. Il n'y a aucun problème qui ne peut pas être résolu avec une quantité suffisante de script shell.
Tom Anderson
1
Je ne resterai pas dans des équipes qui ne se soucient pas d'améliorer la vitesse.
kevin cline
@Tom Sauf trop de couches d'abstention, scripts shell;)
Darien
Non, vous venez d'écrire un script shell qui enveloppe l'autre script shell. Ensuite, il n'y a qu'un seul script shell. CROYEZ-MOI.
Tom Anderson
3
+1: Améliorer la vitesse d'édition -> compiler -> charger -> exécuter -> déboguer -> éditer est la meilleure chose que vous puissiez faire pour accélérer la production de code. Quand je travaillais chez Tymhare, nous avions un gars qui affirmait (correctement) que son code fonctionnait correctement au premier essai 87% du temps. D'un autre côté, j'ai codé comme si j'avais été surdosé avec de la caféine à 1 heure du matin (ce que j'étais). J'ai fait une tonne d'erreurs de frappe, etc., mais je ne m'en faisais pas parce que je savais que le compilateur les rattraperait. À la fin de la journée, j'étais probablement 3 à 5 fois plus productif que lui.
Peter Rowell
8

Les tests automatisés ne remplacent pas l'examen et la compréhension.

Il se peut que vous utilisiez le test comme béquille. Si vous faites cela, vous gênerez votre apprentissage. Je ne préconise pas que vous ne testiez pas. Au lieu de cela, je vous recommanderais avant d'exécuter votre test de revoir ce que vous avez écrit. Comprenez ce que vous avez écrit, assurez-vous que cela a du sens et assurez-vous que la syntaxe est correcte.

Dietbuddha
la source
5

Vous avez déjà donné la réponse: I usually make a lot of syntax errors and logic errors

Donc, en travaillant dur pour améliorer cela, vous devriez être en mesure de réduire le temps de test. Les erreurs de syntaxe doivent être les toutes premières à réduire. Jamais eu un test de programmation avec un papier et un crayon dans votre étude?

J'ai eu la même chose lorsque je suis passé de PHP à Java. J'ai dû apprendre à déboguer au lieu de simplement imprimer certaines variables et appuyer sur F5 dans le navigateur ...

WarrenFaith
la source
2
Nous faisons tous des erreurs stupides de temps en temps, elles ne se produisent que moins avec le temps et l'expérience.
maple_shaft
@maple_shaft c'est vrai, mais quand il dit make a lot ofqu'il semble qu'il devrait investir son énergie pour l'améliorer
WarrenFaith
3
J'ai fait pas mal de codage sur papier et sur des tableaux blancs. Le problème est le même: le code semble correct dès la première inspection, mais après l'avoir exécuté, vous remarquez vos erreurs.
Anne Nonimus
noter des erreurs dans le code et écrire du code avec une syntaxe incorrecte est une grande différence. Le premier peut arriver à tout le monde, le second suggère un niveau débutant. Je ne connais pas votre parcours, mais même en tant que débutant, vous devriez minimiser les problèmes de syntaxe. Quel est votre IDE et votre langue? Il devrait prendre en charge les vérifications de syntaxe.
WarrenFaith
@Anne Nonimus: Voulez-vous dire des erreurs logiques? Les erreurs de syntaxe doivent être récupérées par votre IDE (idéalement - si vous travaillez avec du code généré dynamiquement, ces erreurs de syntaxe ne seront pas détectées au moment de la compilation).
FrustratedWithFormsDesigner
4

Vous avez besoin d'une bonne plate-forme de test unitaire ou fonctionnelle qui peut exécuter automatiquement des tests pour vous, de préférence en arrière-plan. Cela nécessitera l'utilisation de Mocks comme indiqué ci-dessus et selon la langue que vous utilisez une sorte d'injection de dépendance.

En rendant vos objets aussi indépendants que possible puis en utilisant des méthodes d'injection pour ajouter des contraintes extérieures, il n'est pas difficile de créer une plateforme de test pour votre code.

Bill Leeper
la source
2

Le vrai plaisir vient quand vous ne pouvez tout simplement pas tester votre code, sauf en l'utilisant avec colère. Cela se produit souvent avec les systèmes de trading, car les simulateurs d'échange disponibles sont souvent pauvres, inexistants ou ne sont même pas conformes à ce que disent les fournisseurs du logiciel d'échange. Cela fait partie de la riche tapisserie de la vie, je le crains. Mon approche consiste à m'assurer qu'au moins ma partie de la transaction est bien écrite et bien documentée, afin qu'elle puisse facilement être modifiée rapidement.

Neil Butterworth
la source
3
Vous "échangez" et "échangez" les ingénieurs logiciels sont une race unique. Mon ami a eu une série de troubles mentaux en travaillant pour une de ces entreprises. Je n'entends jamais de bonnes choses sortir de ce créneau de l'industrie du logiciel.
maple_shaft
@maple Eh bien, je ne le fais plus moi-même. Mais unique? Non - tout le monde peut écrire du code merdique, et la plupart des codes commerciaux sont profondément, profondément merdiques. Qu'on le veuille ou non, c'est la base de notre société.
Neil Butterworth
Oui, j'ai entendu la même chose à propos du code des télécommunications et du nombre de millions de lignes dans le logiciel de contrôle des commutateurs. Ensuite, j'ai rejoint une entreprise de télécommunications et j'ai réalisé que s'ils avaient employé des programmeurs, des milliers de lignes auraient été suffisantes.
kevin cline
2

Tests unitaires; Applications simulées / simulateurs.

Cela prendra du temps, d'accord, et vous devrez peut-être collecter et masser des données d'échantillonnage pour créer des maquettes appropriées, mais cela sera payant à la fin: vous vous épargnerez tout le temps et les problèmes que vous rencontrez lorsque vous essayez de tester contre des externes systèmes.

Utilisés correctement, ces outils garantissent qu'avant de vous rendre à proximité de systèmes externes, vous êtes sûr à 99,9% que si votre code échoue, c'est quelque chose dans le système externe / changement d'environnement qui l'a provoqué, pas un bogue dans votre propre code.

J'ai travaillé professionnellement pendant un bon moment comme à l'école, et dans de nombreux cas, c'était très efficace. Finalement, j'ai travaillé avec certaines personnes qui m'ont forcé à abandonner cette méthodologie et à utiliser des tests unitaires et des maquettes à la place.

Maintenant, je ne démarre aucun projet sans avoir d'abord réfléchi à la mise en œuvre des phases de test - tests unitaires, maquettes, simulateurs, échantillons de données, etc.

Vecteur
la source
1

Je fais généralement beaucoup d'erreurs de syntaxe et d'erreurs logiques

Peut-être que l'utilisation d'un Linter peut vous aider un peu ici.

J'étais dans une situation similaire avec mon ancien employeur. Notre base de code était vraiment énorme et pour apporter des modifications, je devais coder, compiler puis remplacer les .classfichiers dans un serveur de développement, puis redémarrer le serveur de développement avec le script de redémarrage. Et à ma grande consternation, il faudra environ une demi-heure pour réactiver le serveur de développement.

Plus tard, j'ai découvert que le débogage à distance du serveur de développement était également possible.

Voici donc ce que j'ai fait pour optimiser mon processus

  • Premier tour initial de débogage à distance, cela m'a permis de voir le flux de code exact et les valeurs / états exacts des variables.

  • Planifier comment et quels changements j'apporterai.

  • Apporter des modifications, puis comparer les différences

  • Mise en cache des erreurs en utilisant linter ou en compilant.

  • Donner le correctif en remplaçant les .classfichiers et en redémarrant.

Parfois, j'incluais également beaucoup d'instructions de journal pour vérifier à nouveau le flux de code et pour vérifier les valeurs / états. Cela m'a beaucoup aidé.

L'utilisation d'un IDE avec une bonne auto-complication peut également grandement aider à réduire les fautes de frappe.

J'espère que cela t'aides.

Alaf Azam
la source