La mejor manera de "presentar" OOP / OOD al equipo de ingenieros experimentados de C ++

17

Estoy buscando una manera eficiente, que tampoco sea un insulto, para presentar los conceptos de OOP a los miembros del equipo existentes Mis compañeros de equipo no son nuevos en los idiomas OO. Hemos estado haciendo C ++ / C # durante mucho tiempo, por lo que la tecnología en sí es familiar.

Sin embargo, miro a mi alrededor y sin una gran infusión de esfuerzo (principalmente en forma de revisiones de código), parece que lo que estamos produciendo es código C que está dentro de las clases. Casi no hay uso del principio de responsabilidad única, abstracciones o intentos de minimizar el acoplamiento, solo por nombrar algunos. He visto clases que no tienen un constructor pero ponen memset a 0 cada vez que se instancian.

Pero cada vez que menciono OOP, todos asienten y hacen que parezca que saben exactamente de lo que estoy hablando. Conocer los conceptos es bueno, pero a nosotros (algunos más que a otros) nos parece muy difícil aplicarlos cuando se trata de entregar un trabajo real.

Las revisiones de código han sido muy útiles, pero el problema con las revisiones de código es que solo ocurren después del hecho, por lo que para algunos parece que terminamos reescribiendo (principalmente refactorizando, pero todavía lleva mucho tiempo) el código que se acaba de escribir. Además, las revisiones de código solo brindan comentarios a un ingeniero individual, no a todo el equipo.

Estoy jugando con la idea de hacer una presentación (o una serie) e intentar volver a mostrar OOP junto con algunos ejemplos de código existente que podrían haberse escrito mejor y podrían ser refactorizados. Podría usar algunos proyectos realmente antiguos que ya nadie posee, así que al menos esa parte no debería ser un tema delicado. Sin embargo, ¿funcionará esto? Como dije, la mayoría de la gente ha hecho C ++ durante mucho tiempo, así que supongo que a) se sentarán allí pensando por qué les estoy diciendo cosas que ya saben ob) podrían tomarlo como un insulto porque estoy diciéndoles que no saben cómo hacer el trabajo que han estado haciendo durante años, si no décadas.

¿Existe otro enfoque que llegue a una audiencia más amplia que una revisión de código, pero al mismo tiempo no se sentiría como una conferencia de castigo?

No soy un chico recién salido de la universidad que tiene ideales utópicos de código perfectamente diseñado y no espero eso de nadie. La razón por la que escribo esto es porque acabo de hacer una revisión de una persona que realmente tenía un diseño decente de alto nivel en papel. Sin embargo, si imagina las clases: A -> B -> C -> D, en el código B, C y D implementan casi la misma interfaz pública y B / C tienen funciones de un solo revestimiento, por lo que la clase A más alta está funcionando absolutamente todo el trabajo (hasta gestión de memoria, análisis de cadenas, negociaciones de configuración ...) principalmente en 4 métodos mongo y, para todos los efectos, llama casi directamente a D.

Actualización: Soy un líder tecnológico (6 meses en este puesto) y tengo pleno apoyo del gerente del grupo. Estamos trabajando en un producto muy maduro y los costos de mantenimiento definitivamente se están dando a conocer.

DXM
fuente
3
¿Eres su supervisor o jefe de alguna manera? Si no, ¿tiene el apoyo del director técnico que es el jefe de todos ustedes? Si solo eres uno de los muchachos y el desarrollo ha sido constante y productivo durante años sin usar diseños profundos de OOP, entonces te enfrentarás a una batalla cuesta arriba para convencer a los programadores de que el código de trabajo no funciona y la administración de que no estás desperdiciando mejor gastado dinero generando código.
Patrick Hughes
Después de hacer esta publicación, aparecieron enlaces relacionados que se parecen mucho a mi situación: programmers.stackexchange.com/questions/43214/… . Me preocupa exactamente lo mismo. El problema es que su equipo tenía 2 desarrolladores y definitivamente podría manejar eso con revisiones de código. Estoy buscando un enfoque que funcione con el tamaño de nuestro equipo (10+). Simplemente no puedo comunicarme con cada desarrollador individualmente tanto como me gustaría.
DXM

Respuestas:

5

¿Por qué no desarrolla una breve capacitación en los principios SÓLIDOS y les brinda esta capacitación? Parece que funcionó bastante bien para mí en mi organización actual y creo que dar entrenamientos cortos es realmente divertido (para todos los involucrados).

Cuando impartí mi capacitación, me tomé un tiempo para buscar ejemplos patológicos "malos" en el código existente (de varios proyectos) y los refactoré en la presentación, paso a paso, utilizando los principios. Esto demostró que

  1. No es tan difícil hacer estas refactorizaciones
  2. No toma mucho tiempo
  3. El resultado final (cuidadosamente elegido ;-)) es claramente mejor que el código original.
Joris Timmermans
fuente
5

Las revisiones de código han sido muy útiles, pero el problema con las revisiones de código es que solo ocurren después del hecho.

En un proyecto, hicimos revisiones de diseño.

15 minutos. En la pizarra blanca. Hable sobre el diseño antes de la codificación.

La parte más importante es programar la revisión del diseño antes de cualquier trabajo de implementación.

También tuvimos "Críticas críticas de diseño", que fueron un gran problema. Implicaban muchos documentos y una larga presentación. Fueron difíciles de programar y casi siempre se expulsaron hasta que comenzó la codificación, lo que redujo su valor a cero.

Las revisiones informales del diseño, antes de la codificación, sin presión, sin documentación, permiten una mejor discusión sobre cómo se asignan las responsabilidades y cómo colaborarán los objetos.

S.Lott
fuente
sí, ya hacemos revisiones de diseño exactamente como las describiste. El problema son las tareas medianas. Si la tarea es lo suficientemente grande, generalmente me tomo el tiempo para elaborar un diagrama de clase inicial que luego el equipo refina. Si la tarea es pequeña, el diseño existente de alto nivel ya es lo suficientemente bueno. Sin embargo, para tareas de tamaño mediano, no tengo la capacidad de pensar lo suficiente en el diseño, por lo que la regla básica es "usar el mejor criterio y seguir la POO". Si tuviera que hacer estas tareas yo mismo, comenzaría con la codificación y lo mezclaría con la refactorización continua y ...
DXM
... deje que el código decida cómo se vería el diseño final. Sin embargo, cuando dejo estas tareas a algunos miembros del equipo, lo que a veces encuentro en la revisión del código es algo como lo que describí en mi publicación inicial.
DXM
1
@DXM: ¿Qué? Los estas haciendo? O no haciéndolos? Si es grande, entonces no estás haciendo revisiones de diseño, estás haciendo diseño para otra persona, ¿quién aprende cuando haces diseño? Si es pequeño, entonces no estás haciendo revisiones de diseño, el "diseño existente es lo suficientemente bueno", ¿quién se inclina cuando ignoras el diseño? Si es medio, no diseñas y tampoco revisas sus diseños. No parece que realmente estés haciendo revisiones de diseño reales. ¿Por qué dices que eres y luego das tres ejemplos donde no estás?
S.Lott
@Lott: al reflexionar sobre su respuesta, mi única conclusión es que tiene toda la razón. Supongo que lo que debería haber dicho es que he planteado esta idea exacta al menos 8 veces y todos siempre estuvieron de acuerdo, pero sí, si miro hacia atrás al ritmo que establecimos, realmente no estamos haciendo nada de eso. Me gustaría hablar más sobre esto, pero los mods ya me disciplinaron por tener una discusión en un sitio estrictamente de preguntas y respuestas. ¿Podríamos pasar al chat? Me gustaría explicar más la situación y quizás elegir un poco tu cerebro (o el de cualquier otra persona que quiera unirse). Nunca he chateado, ¿sabes cómo funciona?
DXM
@DXM: el chat es trivial. Y no muy útil. Si tiene más preguntas, más detalladas que esta pregunta inicial, debe hacer esas preguntas más detalladas. Ese es el punto. En algunos casos, "discusión adicional" equivale a "No me gusta su respuesta a mi pregunta por las siguientes razones ...", lo cual es un poco tonto. No me gusta una respuesta, simplemente no me gusta una respuesta y no requiere ninguna discusión. En algunos casos, la discusión equivale a "mi pregunta no es vaga, simplemente no se puede leer". Inútil, de verdad. Haga sus preguntas. Como preguntas
S.Lott
4

Supongo que eres más joven que algunos de los desarrolladores, pero más arriba en la cadena alimentaria.

A riesgo de ser enterrado en votos negativos, podría ser que los 'ingenieros experimentados' estén haciendo lo correcto, o dado que este es un producto maduro que puede haber existido durante décadas, lo que alguna vez fue lo correcto.

El código anterior tiende a haber sido optimizado para ejecutarse rápidamente en el hardware de la época; entre otras cosas, esto significa reducir los niveles de herencia y evitar llamadas a funciones / métodos para operaciones triviales.

Los compiladores se han vuelto mucho más inteligentes a lo largo de los años, por lo que no todo lo que alguna vez fue cierto ahora lo es, por ejemplo, un compilador puede optar por incorporar una pequeña función.

Quizás una ruta hacia adelante sería adoptar un enfoque diferente: pedir a los desarrolladores que expliquen cómo / por qué su método es mejor que la teoría que se les enseñó, y que sean sinceros al respecto.

Phil Lello
fuente
0

Impulsar las pruebas unitarias con una cobertura de ramificación del 100% de cada método nuevo / modificado no conduciría a minimizar el acoplamiento entre los métodos.

Ian
fuente
UT es una buena idea, pero no estoy convencido de que esto logre el resultado deseado. Además, uno de los principios fundamentales de OO es que el acoplamiento entre funciones es inevitable, por lo que es mejor que explique y agrupe tales funciones acopladas en una sola clase.
MSalters
Estoy de acuerdo en que "acoplar cada una de las funciones es inevitable". Sin embargo, un buen diseño reduce el número de otras funciones que cada función también está acoplada. (Una clase es solo un medio para este fin)
Ian
0

Es posible que desee recoger el libro "Patrones de diseño" de la Banda de los Cuatro. No es específico de C ++, por lo que no critica abiertamente el conocimiento de C ++ de sus colegas cuando se refiere a él. Sin embargo, al mismo tiempo, aborda temas que considera relevantes. Además, el libro es ampliamente aceptado como relevante, por lo que no pueden descartarlo fácilmente como teórico o poco práctico.

Por otro lado, considere que C ++ no es un lenguaje OO puro, ni en diseño ni en la práctica. Toda la historia del constructor / memset parece que debes presentar RAII, que no es una técnica OO en absoluto, sino específica de C ++ (desafortunadamente, .Net IDispose muestra lo que sucede cuando RAII es una ocurrencia tardía). Los libros relevantes aquí son (Más) Efectivo C ++ y (Más) Excepcional C ++.

MSalters
fuente
2
¡Pero los autores afirman claramente que los patrones de diseño no son una introducción a OOP / OOD en general! ¡El público primero debe estar familiarizado con las técnicas que ofrece OOP antes de sumergirse en un catálogo de patrones de diseño de código duro! "Head First Design Patterns" será una buena introducción.
Falcon
2
De la descripción de OP se desprende que conocen OOP / OOD, simplemente no lo usan (tal vez por temor a que sea demasiado complicado), en cuyo caso un libro que explica por qué es útil puede motivar mejor que los ejemplos de código.
wildpeaks
@wildpeaks: El OP dice lo contrario. No saben OOP / OOD. Están programando OOP de manera procesal. Necesitan algo para presentarles las técnicas de diseño y el libro GoF no se ajusta a este escenario en mi humilde opinión.
Falcon
Me refería a las oraciones But every time I bring up OOP, everyone always nods and makes it seem like they know exactly what I'm talking abouty My teammates are not new to OO languages, pero puedo ver cómo es un poco vago, ya que pueden estar mintiendo acerca de saber POO cuando OP les habla sobre eso.
wildpeaks
1
@MSalters - Prefacio de los patrones de diseño: "Este libro no es una introducción a la tecnología o diseño orientado a objetos. Muchos libros ya hacen un buen trabajo al respecto. Este libro asume que eres razonablemente competente en al menos un lenguaje de programación orientado a objetos y tú también debería tener cierta experiencia en diseño orientado a objetos ". Este libro no cumple con los requisitos. Deberían leer algunas cosas de nivel de entrada OOD.
Falcon