Comment améliorer la formation des étudiants en matière de maintenabilité? [fermé]

18

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.

Matthias Jouan
la source
PS: Regardez ma réponse là-bas, vous pouvez trouver l'expérience du spaghetti intéressante
PhD
@Nupul Comme vous êtes enseignant et que vous semblez impliqué dans l'enseignement de la maintenabilité du code, veuillez fournir une réponse complète et nous dire comment vous procédez: le code spaghetti n'est qu'une petite partie de celui
Matthias Jouan
Publié une réponse ... j'espère que cela ajoute de la valeur pour vous :)
PhD
Le projet de conception et de maintenabilité d'API dans "Conception d'API pratique" est, à mon humble avis, un projet parfait pour enseigner aux étudiants les défis de la maintenabilité (et de la rétrocompatibilité).
Marco

Réponses:

8

Comment pouvons-nous enseigner la maintenabilité?

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 .

  • cours 1.
    Corrigez les bogues, ajoutez les tests unitaires, la documentation et les fonctionnalités manquants.
  • cours 2.
    Refactor.
  • cours 3.
    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 .

WTF par minute

moucheron
la source
11

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:

  1. Prenons un problème modérément complexe et deux implémentations sémantiquement identiques, mais l'une est beaucoup plus facile à gérer que l'autre.
  2. Demandez un certain nombre de modifications / ajouts de fonctionnalités qui sont beaucoup plus faciles à implémenter sur la meilleure base de code. La moitié des étudiants doivent les implémenter sur la base de code la plus maintenable, l'autre moitié sur la base la moins maintenable.
  3. Par souci d'équité, vous voudrez peut-être répéter cet exercice avec les rôles inversés.
  4. Comparez le nombre moyen de modifications implémentées avec succès entre les bonnes et les mauvaises bases de code, et le temps passé à les implémenter. Demandez aux élèves de partager leurs expériences, d'exprimer leurs griefs et de parler simplement du travail qu'ils ont accompli.

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.

suszterpatt
la source
+1 pour l'exercice. C'est très similaire à quelque chose que je voulais exécuter depuis longtemps; bien que dans ma version, les étudiants écriraient quelque chose dans une spécification, puis il serait donné à quelqu'un d'autre (choisi par moi) de le modifier. Vous pouvez répéter l'activité après avoir enseigné la maintenabilité et les bonnes pratiques, pour faire valoir votre point de vue.
Andy Hunt
1
Vous pourriez mettre sur pied un très bon mini-cours sur la maintenabilité basé sur le chapitre "code odeurs" du refactoring
mjfgates
2

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.

Caleb
la source
1
J'ai du mal à comprendre le downvote ici. Vous pouvez réciter la conception de logiciels de votre bible de choix autant que vous le souhaitez, mais le problème majeur est que les développeurs ont souvent l'impression que cela n'a pas d'importance parce que personne ne se soucie de leur fournir une meilleure alternative à ce qu'ils ont fait . Si vous ne donnez pas aux étudiants le sens de l'importance de douter constamment de la qualité du travail qu'ils produisent et de remettre en question les décisions qu'ils prennent, alors je doute vraiment qu'un cours sur la maintenabilité puisse leur être utile.
Filip Dupanović
@ FilipDupanović D'accord. En allant plus loin, bien que les gens déplorent le manque de préparation des nouveaux diplômés avec des diplômes CS, je ne pense pas que le problème soit surprenant ou unique à la programmation. Bien sûr, il y a une différence entre un nouveau diplômé et un travailleur expérimenté: on a de l'expérience! Un bon programme d'études dans n'importe quel domaine est conceptuel, pas professionnel. Seule l'expérience enseignera aux nouveaux diplômés à appliquer les concepts qu'ils ont appris et à travailler efficacement dans n'importe quel travail dans lequel ils se retrouvent.
Caleb
1

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.

S.Robins
la source
J'ai lu votre réponse avec attention, ainsi que votre article sur "maintenable", et je dois dire que je suis presque entièrement d'accord avec vous. J'ai lu quelques-uns des livres que vous mentionnez et j'utilise - ou je fais utiliser des gens - des principes tels que SOLID au quotidien au travail (je ne suis pas professeur, entre autres). Mais je pense que votre réponse est un peu hors sujet. Je vais modifier ma question pour essayer de clarifier ce que je recherche.
Matthias Jouan
1
Vous faites valoir un bon argument, mais il est également juste de dire qu'un projet est plus ou moins maintenable qu'un autre. Les mots se terminant par -able ou -ible peuvent être absolus ou relatifs, et il semble assez clair que l'OP l'utilise dans un sens relatif.
Caleb
0

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.

Oleksi
la source
1
Bien que la programmation en binôme soit un très bon moyen d'apprendre auprès de développeurs plus qualifiés et que la lecture des livres de Robert C. Martin ait définitivement changé ma vie, la question portait davantage sur un mode d'apprentissage purement académique: comment mieux préparer les élèves avant leur arrivée le monde professionnel du développement logiciel.
Matthias Jouan
1
-1: La suggestion de @ suszterpatt sonne beaucoup mieux.
Jim
0

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.

java_mouse
la source
-1

@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)

Divisez la classe en deux - donnez à une section une tâche de codage simple qui doit être effectuée en 1 à 2 jours. Max. Délai contraignant. Ils doivent faire le travail en toutes circonstances - ligne directrice - "code de travail" comme ils l'entendent. Pour l'autre groupe d'étudiants, le même devoir, mais avec une liste de conventions (de dénomination) et quelques lignes directrices sur la conception et la façon dont les points seront déduits s'ils ne sont pas suivis. Ce n'est PAS de la triche, même si cela y ressemble;) Maintenant, demandez-leur d'échanger les codes, c'est-à-dire que le groupe 1 fonctionne maintenant sur ce que le groupe 2 a fait et vice versa. Suggérez maintenant une modification de l'affectation de codage d'origine et demandez-leur de le faire dans le même laps de temps. Réunissez-vous et demandez-leur à quel point cela a été facile / difficile et ouvrez la parole aux discussions / opinions. Le point atteindra certainement la maison - de fortes chances que 50% de la classe soient heureux et trouvent cela facile et 50% trouvent cela difficile. Vous pouvez également leur demander de travailler sur leur propre chose après 3 semaines et voir s'ils peuvent le faire en 1 jour;)

(Une bonne tournure consiste à écrire le même morceau de code de manière compliquée et à donner à la classe pour modification avec le leur)

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!

Doctorat
la source
@Downvoter - veuillez laisser un commentaire pour augmenter les chances d'améliorer le post :)
PhD