La maintenabilité est un enjeu majeur du développement logiciel professionnel. En effet, la maintenance est presque toujours la partie la plus longue du cycle de vie d'un logiciel, car elle dure de la sortie du projet jusqu'à la fin des temps.
De plus, les projets en cours de maintenance représentent une grande majorité du nombre total de projets. Selon http://www.vlegaci.com/298/interesting-statistics-%E2%80%93-numbers-of-programmers-in-maintenance-vs-development/ , la proportion de projets en cours de maintenance est d'environ 2 / 3.
Je suis récemment tombé sur cette question , où le gars a l'air assez surpris de découvrir que son travail concerne principalement la maintenance. J'ai alors décidé d'ouvrir une discussion (français) sur le site principal de la communauté française des professionnels du développement logiciel ( http://www.developpez.com/ ). La discussion est intitulée "Les étudiants sont-ils suffisamment bien formés à la réalité du développement logiciel professionnel?" et concerne principalement la maintenabilité . Il a été souligné que, du moins en France, les gens ne sont pas suffisamment bien préparés pour faire face à l'entretien dans les deux aspects:
- maintenir le code existant
- rendre le code maintenable
Ma question ici fait écho à cette discussion et vise à trouver un bon moyen d'enseigner la maintenabilité.
- Comment pouvons-nous enseigner la maintenabilité?
- Quel type d'exercice proposeriez-vous?
- Si vous avez été bien formé en matière de maintenabilité, quel type particulier de cours avez-vous suivi?
[modifier] Après quelques malentendus, je pense que je dois clarifier ma question. En tant que chef de projet et développeur de logiciels, je travaille souvent avec des stagiaires ou des étudiants fraîchement diplômés. J'ai été moi-même fraîchement diplômé. Le fait est que les étudiants ne connaissent généralement pas les principes tels que SOLID qui augmentent la maintenabilité d'un projet. On finit souvent par avoir des difficultés importantes à faire évoluer les projets (faible maintenabilité). Ce que je recherche ici est un exemple académique concret d'un enseignement réussi sur l'importance de la maintenabilité et comment faire un meilleur code concernant ce point particulier; ou des suggestions possibles pour améliorer la formation des étudiants.
la source
Réponses:
C'est une question de pratique.
La façon la plus simple de la pratiquer de manière contrôlée à laquelle je peux penser est de simuler un projet de maintenance typique comme suit.
Obtenez un projet ( projet A ) qui est bien fait et introduisez quelques problèmes dessus: injectez quelques bugs, une bonne dizaine de code dupliqué et mort, supprimez certaines fonctionnalités, tests unitaires et documentation ici et là, etc. Vous pouvez même avoir un espace dédié nom pour cela, comme Project A - version endommagée .
Établissez un outil de suivi des problèmes et remplissez-le de demandes correspondant aux dommages particuliers que vous avez causés. Établissez des règles et des pratiques de base pour le processus de développement - engagements VCS, revues de code, assurance qualité, etc. - envisagez de prendre ce que vous pouvez à partir de la liste de contrôle fournie dans le test Joel .
Corrigez les bogues, ajoutez les tests unitaires, la documentation et les fonctionnalités manquants.
Refactor.
Maintenance / amélioration des projets originaux à utiliser par les étudiants de l'année prochaine
- Projet A version 2.0 et Projet A - version endommagée 2.0 , respectivement.
En améliorant la version endommagée, j'entends y faire de meilleurs dégâts éducatifs. :)
Parmi les pratiques mentionnées ci-dessus, accordez une attention particulière à celle des revues de code . C'est probablement le moyen le plus efficace de garantir la facilité de maintenance du code, comme l'indique par exemple la première réponse à la question connexe .
la source
Avertissement: je viens de recevoir mon diplôme CS. Je ne suis pas professeur.
Cela peut sembler évident, mais je pense que la meilleure façon d'enseigner la maintenance du code est de demander aux étudiants d'effectuer la maintenance du code. Voici ce que je ferais:
L'idée est non seulement de faire travailler les étudiants avec le code de quelqu'un d'autre, mais aussi de leur faire développer une appréciation du code maintenable qui améliorera, espérons-le, leurs compétences en conception.
la source
La maintenabilité est une vertu, pas une compétence. Il existe de nombreuses voies pour créer des projets maintenables, mais aucune formule n'est garantie pour les produire.
Si vous appréciez les vertus comme la gentillesse et la générosité, vous cherchez des moyens de les pratiquer dans votre vie quotidienne. C'est la même chose avec la maintenabilité: si vous et votre organisation appréciez la maintenabilité, vous la garderez à l'esprit lorsque vous concevrez et implémenterez votre projet. Ce sera une raison légitime de passer un peu de temps supplémentaire à construire quelque chose parce que vous savez que la maintenabilité est appréciée. À l'inverse, il est déconseillé de passer plus de temps pour la maintenabilité dans une organisation qui ne l'apprécie pas.
Si vous voulez apprendre aux gens à rendre les choses maintenables, vous devez commencer par indiquer clairement que votre organisation valorise la maintenabilité. Précisez-le dans les exigences de vos projets. Faites-en l'un des critères de réussite des revues de code. En bref, intégrez la maintenabilité à votre culture .
Ensuite, soyez prêt à consacrer des ressources à l'amélioration de la maintenabilité de vos projets existants. Identifiez les parties d'un projet où les bogues continuent à apparaître, ou où corriger des bogues ou apporter des modifications est très difficile et prend beaucoup de temps, et repenser ou refactoriser pour faciliter la maintenance.
Enfin, endoctrinez de nouveaux développeurs dans votre culture de maintenabilité en les affectant à des équipes qui le pratiquent déjà quotidiennement. Il n'y a pas de meilleur moyen d'aider quelqu'un à adopter une valeur que de lui donner de nombreux bons exemples et conseils.
la source
Pour ma part, je n'aime pas le terme maintenable par rapport au développement de logiciels. La réalité est que tous les logiciels sont maintenables en ce sens qu'ils peuvent être soumis à des travaux de maintenance, donc le vrai problème est de savoir si les logiciels sont coûteux ou peu coûteux à entretenir, relativement parlant. Je sais que cela ressemble à une déclaration très pédante à faire au début d'une réponse, mais mon point deviendra plus clair dans un instant.
Le problème avec les diplômes en informatique qui se spécialisent dans le développement de logiciels est qu'ils n'enseignent vraiment aux étudiants que le minimum le plus strict que les étudiants doivent savoir sur l'écriture de logiciels. Les compétences et connaissances professionnelles sont acquises grâce à l'apprentissage qui se fait au cours des premières années aprèsqualifiant pour le diplôme. C'est à ce moment-là qu'un diplômé commence à travailler sur des projets qui comptent réellement pour un client, dans un environnement où il y a une grande pression pour effectuer, et l'attente est de créer un produit à un niveau professionnel. Malheureusement, de nombreuses entreprises n'encouragent pas une culture où les normes professionnelles en matière de logiciels sont maintenues, et elles se retrouvent avec des projets qui s'avèrent coûteux à développer et à maintenir en conséquence. Malheureusement pour nos diplômés, ils apprennent beaucoup de mauvaises habitudes dans de tels environnements dans les premières années de leur carrière, et cela peut prendre beaucoup de temps avant d'apprendre à surmonter ces habitudes ... voire pas du tout.
Vous feriez mieux d'enseigner aux élèves comment écrire du code propre et comment identifier les problèmes dans les logiciels qui finissent généralement par engendrer des dettes techniques . Consultez les livres sur le code propre , la refactorisation et le développement de logiciels Lean comme point de départ et commencez à enseigner aux élèves à écrire des tests unitaires avant le code d'implémentation afin de garantir une couverture élevée des tests. Enseignez aux élèves à reconnaître les modèles dupliqués et répétitifs dans leur code, et comment refactoriser le code pour supprimer une telle duplication. Aider les élèves à comprendre et à appliquer des principes tels que SOLID et DRY. Plus important encore, supprimez cette idée que la capacité de maintenir le code est quelque chose qui se fait uniquement sur la base de la conception et de la mise en œuvre du code, et instillez plutôt un sens de l'artisanat et de la qualité dans la production de logiciels dès le départ, en cherchant à affiner le code au fur et à mesure de sa mise en œuvre afin de minimiser l'impact de l'endettement technique et ainsi de minimiser dans le temps les coûts de maintenance des logiciels.
la source
Je pense que la meilleure façon d'apprendre ce genre de compétences est de faire des revues de code et des programmations de paires. Lors des révisions de code, le personnel expérimenté peut indiquer comment rendre le code plus maintenable (généralement en le rendant plus lisible) et justifier pourquoi certains choix peuvent créer un code plus maintenable.
La programmation par paires est un meilleur moyen d'enseigner ce genre de choses, car elle donne au personnel moins expérimenté une expérience directe dans la gestion du code avec quelqu'un qui sait déjà bien le faire.
Il existe également d'excellents livres que vous pouvez lire sur l'écriture de code propre et maintenable. Le code propre me vient à l'esprit.
Il est difficile d'acquérir cette expérience dans le monde universitaire, car les étudiants modifient rarement les grandes bases de code. La plupart de ces compétences proviendront de l'apprentissage sur le tas, et les révisions de code et la programmation par paires peuvent vraiment faciliter cet apprentissage.
la source
Bon code = moins d'entretien et facile à améliorer / ajouter des fonctionnalités.
Mauvais code = cauchemar de maintenance
Fondamentalement, nous devons faire comprendre aux étudiants que «chaque fois qu'il y a un code merdique dans un projet, un nouveau développeur qui va rejoindre l'entreprise parce que l'auteur original du code va en souffrir et comment le logiciel est impacté . "
Donc, l'un des meilleurs moyens d'enseigner à l'étudiant la maintenance logicielle est de montrer l'exemple du bon code et du mauvais code et de leur demander d'ajouter une fonctionnalité, puis de leur enseigner qu'écrire un bon code n'est pas seulement pour l'autosatisfaction, mais pour faire c'est facile pour les gens qui vont maintenir le code.
Exercice:
1) Avoir un mauvais code pré-écrit (par exemple) un code en double, une méthode disant "pour calculer le paiement hypothécaire" est écrite à 9 endroits dans un projet.
Demandez à l'étudiant d'améliorer la fonctionnalité pour "ajouter un supplément de 1,2% à tous les versements hypothécaires".
Maintenant, l'étudiant verra la douleur de localiser et de corriger le code dans les 9 endroits. Il y a de nombreuses chances qu'il ne puisse localiser les 9 endroits où le «versement hypothécaire» est calculé.
2) Montrez maintenant le bon code qui a cette méthode qui calcule le paiement hypothécaire en un seul et unique endroit . démontrer à l'élève qu'il est facile d'améliorer un code bien écrit et lui expliquer comment cela améliore la maintenabilité du code / projet.
BTW, j'ai adoré votre approche d'exposer les étudiants à la maintenabilité du logiciel.
la source
@mattmattj: Puisqu'il y a BEAUCOUP de réponses et que le lien que j'ai publié a aussi de bons pointeurs, j'ajouterai quelque chose qui, espérons-le, n'est pas une répétition des réponses déjà publiées.
Premièrement, il faut définir la «maintenabilité» - il n'y a pas une seule définition acceptée par tous - semblable à celle de l'architecture logicielle. Alors choisissez celui qui vous semble le plus important, tout englobant et énoncez-le en 3-4 lignes au maximum. Ensuite, vous pouvez parler de certaines mesures comme - le temps de se souvenir / comprendre votre propre code (ou celui de quelqu'un d'autre), le nombre de WTF par minute / heure, etc. Gardez-le léger (humoristique) - cela les rendra plus réceptifs à ce que vous avez dire après ça.
Certains exercices (cela peut sembler se chevaucher un peu avec certaines des réponses, veuillez pardonner)
Voici où vous jetez les bases de la maintenabilité - chaque ligne de code modifiée / mise à jour coûte de l'argent à l'entreprise. Plus il est facile de lire et de mémoriser du code, meilleure / plus rapide est la modification qui contribuerait à réduire le délai de mise sur le marché. Très important dans l'espace technologique en évolution rapide d'aujourd'hui. La maintenabilité est la clé d'une évolution efficace des systèmes.
Il est important de comprendre la différence entre le développement de sites nouveaux et de sites contaminés - tous les projets ou systèmes ne seraient pas créés à partir de zéro (il est plutôt difficile de trouver ou de faire partie de projets "à partir de zéro"). Expliquer que le champ est "intrinsèquement" marron et que vous devez passer du temps à le façonner au fur et à mesure de son élimination éventuelle lorsqu'il devient "hors de la main" (uniquement possible lorsque la dérive est trop importante et "non maintenable"). Le plus tôt ils acceptent cela, mieux c'est. C'est difficile car la programmation est intrinsèquement créative mais l'amélioration du code de quelqu'un d'autre n'est pas perçue comme telle - tournez-la. La créativité permet de comprendre le code, puis d'appliquer «votre» créativité pour l'améliorer - si elle est mieux entretenue, vous pourrez à l'avenir l'améliorer de manière plus créative.
N'hésitez pas à vous référer à l'analogie des spaghettis dans le lien ci-dessus ... j'espère que cela aidera à atteindre certains points. Les autres réponses aident à combler les lacunes et devraient vous aider avec l'enseignement! Bonne chance!
la source