meilleure façon de «présenter» OOP / OOD à une équipe d'ingénieurs C ++ expérimentés

17

Je cherche un moyen efficace, qui ne se présente pas non plus comme une insulte, d'introduire des concepts de POO aux membres de l'équipe existants? Mes coéquipiers ne sont pas nouveaux dans les langues OO. Nous faisons du C ++ / C # depuis longtemps, donc la technologie elle-même est familière.

Cependant, je regarde autour de moi et sans effort majeur (principalement sous forme de revues de code), il semble que ce que nous produisons soit du code C qui se trouve à l'intérieur des classes. Il n'y a presque pas d'utilisation du principe de responsabilité unique, des abstractions ou des tentatives pour minimiser le couplage, pour n'en nommer que quelques-uns. J'ai vu des classes qui n'ont pas de constructeur mais qui mettent le memset à 0 chaque fois qu'elles sont instanciées.

Mais chaque fois que j'évoque la POO, tout le monde hoche toujours la tête et donne l'impression de savoir exactement de quoi je parle. Connaître les concepts est une bonne chose, mais nous (certains plus que d'autres) semblons avoir beaucoup de mal à les appliquer lorsqu'il s'agit de fournir un travail réel.

Les revues de code ont été très utiles, mais le problème avec les revues de code est qu'elles ne surviennent qu'après coup, donc pour certains, il semble que nous finissions par réécrire (c'est principalement une refactorisation, mais cela prend encore beaucoup de temps) du code qui vient d'être écrit. De plus, les revues de code ne donnent de feedback qu'à un ingénieur individuel, pas à toute l'équipe.

Je suis en train de jouer avec l'idée de faire une présentation (ou une série) et d'essayer de faire apparaître OOP à nouveau avec quelques exemples de code existant qui auraient pu être mieux écrits et pourraient être refactorisés. Je pourrais utiliser des projets vraiment anciens que personne ne possède plus, donc au moins cette partie ne devrait pas être un problème sensible. Cependant, cela fonctionnera-t-il? Comme je l'ai dit, la plupart des gens ont fait du C ++ depuis longtemps, donc je suppose que a) ils resteront là à penser pourquoi je leur dis des choses qu'ils connaissent déjà ou b) ils pourraient en fait le prendre comme une insulte parce que je suis leur dire qu'ils ne savent pas comment faire le travail qu'ils font depuis des années, voire des décennies.

Existe-t-il une autre approche qui toucherait un public plus large que ne le ferait une revue de code, mais en même temps ne se sentirait pas comme une conférence de punition?

Je ne suis pas un nouveau venu de l'université qui a des idéaux utopiques de code parfaitement conçu et je n'attends cela de personne. La raison pour laquelle j'écris ceci est parce que je viens de faire une revue d'une personne qui avait en fait un design de haut niveau décent sur papier. Cependant, si vous imaginez des classes: A -> B -> C -> D, dans le code B, C et D implémentent presque la même interface publique et B / C ont une fonction de ligne de sorte que la classe A la plus performante se comporte absolument tout le travail (jusqu'à la gestion de la mémoire, l'analyse des chaînes, les négociations de configuration ...) principalement en 4 méthodes mongo et, à toutes fins utiles, appelle presque directement en D.

Mise à jour: Je suis un responsable technique (6 mois dans ce rôle) et j'ai le soutien total du chef de groupe. Nous travaillons sur un produit très mature et les coûts de maintenance se font définitivement connaître.

DXM
la source
Copie
3
Êtes-vous leur superviseur ou patron d'une manière ou d'une autre? Sinon, avez-vous le soutien du directeur technique qui est le patron de vous tous? Si vous n'êtes qu'un des gars et que le développement a été stable et productif pendant des années sans utiliser de conceptions OOP approfondies, vous êtes dans une bataille difficile pour convaincre les programmeurs que le code de travail ne fonctionne pas et que la gestion ne gaspille pas l'argent mieux dépensé à générer du code.
Patrick Hughes
Après avoir fait ce post, un lien lié a surgi qui ressemble beaucoup à ma situation: programmers.stackexchange.com/questions/43214/… . Je m'inquiète exactement de la même chose. Le problème est que leur équipe avait 2 développeurs et je pourrais certainement gérer cela avec des revues de code. Je suis à la recherche d'une approche qui fonctionnerait avec la taille de notre équipe (10+). Je n'arrive pas à communiquer avec tous les développeurs en tête-à-tête autant que je le souhaiterais.
DXM

Réponses:

5

Pourquoi ne développez-vous pas une courte formation aux principes SOLID et ne leur donnez-vous pas cette formation? Cela semble avoir très bien fonctionné pour moi dans mon organisation actuelle et je trouve que donner des formations courtes est vraiment amusant (pour toutes les personnes impliquées).

Quand j'ai donné ma formation, j'ai pris un peu de temps pour rechercher des "mauvais" exemples pathologiques dans le code existant (de divers projets), et les refactoriser dans la présentation, pas à pas, en utilisant les principes. Cela a démontré que

  1. Ce n'est pas si difficile de faire ces refactorings
  2. Ça ne prend pas longtemps
  3. Le résultat final (soigneusement choisi ;-)) est clairement meilleur que le code d'origine.
Joris Timmermans
la source
5

Les revues de code ont été très utiles mais le problème avec les revues de code est qu'elles ne se produisent qu'après coup.

Sur un projet, nous avons fait des revues de conception.

15 minutes. Au tableau blanc. Parlez de la conception avant de coder.

La partie la plus importante consiste à planifier l'examen de la conception avant tout travail de mise en œuvre.

Nous avons également eu des «critiques de conception», qui étaient un gros problème en sueur. Ils impliquaient de nombreux documents et une longue présentation. Ils étaient difficiles à planifier et étaient presque toujours repoussés jusqu'à ce que le codage ait commencé, réduisant leur valeur à zéro.

Des revues de conception informelles - avant le codage - aucune pression - aucune documentation - permettent de mieux discuter de la façon dont les responsabilités sont attribuées et de la façon dont les objets vont collaborer.

S.Lott
la source
oui, nous faisons déjà des revues de conception exactement comme vous les avez décrites. Le problème vient des tâches de taille moyenne. Si la tâche est suffisamment importante, je prends généralement le temps de proposer un diagramme de classe initial qui est ensuite affiné par l'équipe. Si la tâche est petite, la conception de haut niveau existante est déjà suffisamment bonne. Cependant, pour les tâches de taille moyenne, je n'ai pas la capacité de réfléchir suffisamment à la conception, la règle de base est donc "utiliser le meilleur jugement et suivre la POO". Si je devais faire ces tâches moi-même, je commencerais par coder et mélanger cela avec une refactorisation continue et ...
DXM
... laissez le code décider à quoi ressemblera la conception finale. Cependant, lorsque je laisse ces tâches à certains membres de l'équipe, ce que je trouve parfois dans la revue de code est quelque chose comme celui que j'ai décrit dans mon post initial.
DXM
1
@DXM: Quoi? Tu les fais? Ou ne pas les faire? S'il est grand, alors vous ne faites pas de revues de design - vous faites du design pour quelqu'un d'autre - qui apprend quand vous faites du design? Si elle est petite, vous ne faites pas de revues de conception - la "conception existante est assez bonne" - qui se penche lorsque vous ignorez la conception? Si c'est moyen, vous ne faites pas de design, et vous ne passez pas en revue leurs designs non plus? Il ne semble pas que vous fassiez réellement des revues de conception. Pourquoi dites-vous que vous êtes et donnez ensuite trois exemples où vous n'êtes pas?
S.Lott
@Lott: après réflexion sur votre réponse, ma seule conclusion est que vous avez absolument raison. Je suppose que ce que j'aurais dû dire, c'est que j'ai soulevé cette idée exacte au moins 8 fois et tout le monde était toujours d'accord, mais oui, si je repense au rythme sur lequel nous nous sommes installés, nous ne faisons vraiment rien de tout cela. J'aimerais en discuter davantage, mais j'ai déjà été sanctionné par des mods pour avoir une discussion sur un site strictement Q&R. Pouvons-nous passer au chat? Je voudrais expliquer la situation plus en détail et peut-être choisir un peu votre cerveau (ou toute autre personne qui souhaite se joindre). Jamais fait de chat, vous savez comment ça marche?
DXM
@DXM: le trivial du chat. Et pas trop utile. Si vous avez d'autres questions - plus détaillées que cette question initiale - vous devriez poser ces questions plus détaillées. C'est le but. Dans quelques cas, "une discussion plus approfondie" équivaut à "je n'aime pas votre réponse à ma question pour les raisons suivantes ...", ce qui est plutôt idiot. Ne pas aimer une réponse, c'est simplement ne pas aimer une réponse et ne nécessite aucune discussion. Dans certains cas, la discussion revient à "ma question n'est pas vague, vous ne pouvez tout simplement pas lire". Inutile, vraiment. Pose tes questions. Comme des questions.
S.Lott
4

Je suppose que vous êtes plus jeune que certains développeurs, mais plus haut dans la chaîne alimentaire.

Au risque d'être enterré dans les votes descendants, il se pourrait que les `` ingénieurs expérimentés '' fassent en fait la bonne chose - ou puisqu'il s'agit d'un produit mature qui peut exister depuis des décennies, ce qui était autrefois la bonne chose.

Le code plus ancien a généralement été optimisé pour s'exécuter rapidement sur le matériel de l'époque; cela signifie entre autres réduire les niveaux d'héritage et éviter les appels de fonction / méthode pour des opérations triviales.

Les compilateurs sont devenus beaucoup plus intelligents au fil des ans, donc tout ce qui était autrefois vrai ne l'est plus - par exemple, un compilateur peut choisir d'inclure une petite fonction.

Une voie à suivre serait peut-être d'adopter une approche différente - demandez aux développeurs d'expliquer comment / pourquoi leur méthode est meilleure que la théorie qui vous a été enseignée - et soyez sincère à ce sujet.

Phil Lello
la source
0

Pousser pour des tests unitaires avec une couverture de 100% des branches de chaque méthode nouvelle / modifiée ne conduirait pas à minimiser le couplage entre les méthodes.

Ian
la source
L'UT est une bonne idée, mais je ne suis pas convaincu que cela permettrait d'atteindre le résultat souhaité. En outre, l'un des principes fondamentaux de l'OO est que le couplage entre les fonctions est inévitable, il est donc préférable de le rendre explicite et de regrouper ces fonctions couplées dans une seule classe.
MSalters
Je suis d'accord que "coupler chacune entre les fonctions est inévitable". Cependant, une bonne conception réduit le nombre d'autres fonctions, chaque fonction étant également couplée. (Un cours n'est qu'un moyen pour atteindre cet objectif)
Ian
0

Vous voudrez peut-être prendre le livre "Design Patterns" du Gang of Four. Ce n'est pas spécifique au C ++, donc vous ne critiquez pas ouvertement les connaissances C ++ de vos collègues lorsque vous vous y référez. Pourtant, en même temps, il aborde des sujets que vous jugez pertinents. En outre, le livre est largement accepté comme pertinent, de sorte qu'ils ne peuvent pas facilement le rejeter comme théorique ou peu pratique.

D'un autre côté, considérons que le C ++ n'est pas un pur langage OO, ni dans la conception ni dans la pratique. Toute l'histoire du constructeur / memset semble que vous devriez introduire RAII, qui n'est pas du tout une technique OO mais spécifique au C ++ (malheureusement - IDNet de .Net montre ce qui se passe lorsque RAII est une réflexion après coup). Les livres pertinents ici sont (Plus) C ++ efficace et (Plus) C ++ exceptionnel.

MSalters
la source
2
Mais les auteurs indiquent clairement que les modèles de conception ne sont pas une introduction à la POO / OOD en général! Le public doit d'abord se familiariser avec les techniques proposées par OOP avant de plonger dans un catalogue de modèles de conception en code dur! "Head First Design Patterns" fera une bonne introduction.
Falcon
2
Il ressort de la description de l'OP qu'ils connaissent OOP / OOD, ils ne l'utilisent tout simplement pas (peut-être par peur que ce soit trop compliqué), auquel cas un livre qui explique pourquoi il est utile peut motiver mieux que des exemples de code.
wildpeaks
@wildpeaks: L'OP dit le contraire. Ils ne connaissent pas OOP / OOD. Ils programment la POO de manière procédurale. Ils ont besoin de quelque chose pour les initier aux techniques de conception et le livre du GoF ne convient pas à ce scénario.
Falcon
Je faisais référence aux phrases But every time I bring up OOP, everyone always nods and makes it seem like they know exactly what I'm talking aboutet My teammates are not new to OO languages, mais je peux voir à quel point c'est un peu vague, car ils peuvent simplement mentir au sujet de la connaissance de la POO lorsque OP leur en parle.
wildpeaks
1
@MSalters - Préface des modèles de conception: "Ce livre n'est pas une introduction à la technologie ou à la conception orientée objet. De nombreux livres font déjà un bon travail à ce sujet. Ce livre suppose que vous êtes raisonnablement compétent dans au moins un langage de programmation orienté objet et vous devrait également avoir une certaine expérience dans la conception orientée objet. " Ce livre ne correspond pas aux exigences. Ils devraient lire des trucs OOD d'entrée de gamme.
Falcon