Hacer patrones de diseño sofocar la creatividad

21

Hace muchos años, estaba hablando con un profesor de Economía sobre patrones de diseño, cómo estaban estableciendo un lenguaje común para los programadores y cómo estaban resolviendo problemas conocidos de una manera agradable, etc.

Luego me respondió que este es exactamente el enfoque opuesto que usaría para sus estudiantes de Economía. Usualmente presentaba un problema y les pedía que encontraran una solución primero, para que pudieran pensarlo primero y tratar de encontrar formas de resolver el problema primero, y solo después de eso, presentó la solución "clásica".

Así que estaba pensando si el enfoque del "patrón de diseño" es realmente algo que hace que los programadores sean más inteligentes o más tontos, ya que muchas veces solo están obteniendo la "solución correcta para este problema" en lugar de usar la creatividad y la imaginación para resolver algún problema en un Forma nueva e innovadora.

¿Qué piensas?

León
fuente
55
Sugeriría leer un lenguaje de patrones (el libro, no el artículo de Wikipedia) sobre el cual se basan los conceptos de patrones de la arquitectura de software. No son bloques de construcción o piezas de rompecabezas para encajar entre sí.
11
Inclinarse / Enseñar es diferente de hacer. Por lo tanto, un curso de CS realmente bueno puede hacer que escriba un compilador; si le sugiere a su empleador que necesita escribir un compilador para su sistema de procesamiento de pedidos, debería / debería ser despedido.
James Anderson
2
No creo que los dos sean necesariamente comparables: los patrones de diseño no son la solución clásica, son un enfoque para una multitud de soluciones.
jmoreno
1
posible duplicado de patrones de diseño: ¿los utiliza? - la pregunta puede sonar diferente, pero las respuestas a esa pregunta encajan bien en este caso.
Doc Brown
2
No sé acerca de la creatividad, pero la multitud de "¿Qué patrón es este?" o "¿Hay un patrón para esto?" Las preguntas dan la impresión de que algunos desarrolladores piensan que hay un patrón para todo.
JeffO

Respuestas:

43

Su profesor de economía es absolutamente correcto.

Los patrones de diseño de software son principalmente una forma para que los desarrolladores de software con experiencia se comuniquen entre sí . Son una abreviatura de soluciones establecidas a problemas conocidos.

Pero solo deberían ser utilizados por personas que entiendan cómo resolver el problema sin el patrón, o que hayan presentado un patrón similar por su cuenta. De lo contrario, tendrán el mismo problema que el codificador de copiar / pegar; Tendrán código, pero no entenderán cómo funciona y, por lo tanto, no podrán solucionarlo.

Además, muchos de los patrones de diseño son patrones empresariales , patrones que están destinados a ser utilizados en grandes sistemas de software corporativos. Si aprende las maravillas del contenedor de Inversión de control, querrá usarlo en cada programa que escriba, a pesar de que la mayoría de los programas no lo necesitan realmente (hay mejores formas de inyectar sus dependencias en programas más pequeños, de manera que no No requiere un contenedor IoC).

Aprende los patrones. Comprender los patrones y su uso apropiado. Sepa cómo resolver el mismo problema sin el patrón (todos los patrones de software son abstracciones sobre algoritmos fundamentales). Entonces podrá usar patrones de software con confianza, cuando tenga sentido hacerlo.

Robert Harvey
fuente
3
Estoy bastante seguro de que hay tantos desarrolladores que, sin usar patrones de diseño, escribirán un código de tan baja calidad que nadie quiere siquiera mirarlo. No estoy de acuerdo con que sea utilizado SOLO por personas que entiendan cómo resolver el problema sin el patrón ... Para mí, ese es el punto central de un patrón de diseño; Si sabía cómo hacerlo, ¿por qué debería elegir un patrón de diseño? ¿Qué deberían hacer esos otros desarrolladores si los obligamos a no usar un patrón de diseño? ¿Deberían hacer un software real con sus ideas y dejar que falle y luego aprender algo nuevo?
Mahdi
18
@Mahdi, cuando muchas personas encuentran la misma solución, esa solución se llama patrón. No es al revés: no miras los patrones y los usas como soluciones, miras las soluciones y encuentras patrones.
user253751
13
@Mahdi Veo muchos más principiantes que piensan que si solo usan el patrón XXX crearán un software perfecto cada vez (donde XXX es lo que hayan leído al final, por supuesto) y luego se desviven para torturar cada proyecto para que encaje ese patrón
Jwent
55
@ Mahdi: no tomes la frase "por personas que entienden cómo resolver el problema sin el patrón" demasiado literalmente. Robert seguramente significa "por personas que han entendido el problema en juego lo suficientemente bien como para tomar una decisión razonable sobre cuándo usar un patrón y cuándo no".
Doc Brown
2
@Dunk Puedo probar algo creativo en la parte superior de un patrón bien conocido o puedo hacerlo desde cero, pero después de probar muchas otras cosas y después de comprender cuáles son los pros y los contras exactos de cada patrón. Si me pides que vaya a construir una casa por primera vez y solo me digas que sea creativo, no voy a llegar tan lejos para construir algo sólido, simplemente porque eso es demasiado complicado en primer lugar. Si quiere ser creativo en lugar de usar un patrón, ya debe tener una comprensión sólida del problema en sí mismo, y lo obtendrá solo después de años de experiencia ...
Mahdi
21

La forma en que la gente de Patrones de diseño quiere que veas Patrones de diseño es como un conjunto de soluciones que puedes aplicar si surgen problemas similares. No quieren que pienses en ellas como las únicas soluciones posibles, dadas por Dios a Moisés tallado en tablas de piedra sobre la montaña.

Desafortunadamente, algunas personas los toman como algo más cercano a la escritura sagrada que a un montón de diseños de ejemplo de los que se puede aprender. Eso mata la creatividad y crea un culto de carga.

Su profesor de economía mencionó presentarles el problema a los estudiantes y pedirles que intenten resolverlo primero, lo cual es una buena técnica educativa, pero tenía una solución para mostrarles. Tener un montón de soluciones para muchos problemas diferentes en tu cabeza es algo bueno, y es algo que Design Patterns intenta ser. Creo que falla de alguna manera (Singleton fomenta malos enfoques, un enfoque miope en OO imperativo, etc.), pero podría usarse bien con inteligencia y gusto. Sin embargo, es un error pensar que cada posible solución de ejemplo en software debe ser un patrón de diseño oficial.

Si observa un problema y se pregunta "¿Cuál es el patrón de diseño para esto?", Lo está haciendo mal y será menos probable que vea una solución que lo esté mirando a la cara.

Si observa un problema y se pregunta "¿Cómo puedo resolver esto?", Entonces, si hay una solución sin patrones, la verá, y si hay un patrón que encaje, también lo verá.

Michael Shaw
fuente
10

También creo que su profesor de economía es correcto y esa es una manera de aprender cualquier cosa en primer lugar; Sin embargo, echemos un vistazo así: ¿Mantendría la Rueda en secreto y dejaría que todos la reinventaran, en aras de la Creatividad ? Espero que diga No, porque no todas las personas están hechas / son capaces de inventar sus ruedas, y si lo son, lo harán en algún momento, no importa si son conscientes de la existencia de la rueda o no.

Volvamos a los programadores; Soy desarrollador web por día, por lo que MVC es una de esas cosas con las que interactúo a diario. Varias veces intenté construir mis propias estructuras, aprendí mucho, pero todas ellas básicamente no tuvieron éxito. Hice lo mejor que pude, pero ¿qué pasaría si no hubiera MVC? Bueno, simple, mi código fuente apesta, en términos de confiabilidad, facilidad de mantenimiento y capacidad de ampliación.

Creo que es lo mismo para la mayoría de nosotros. Si nadie le cuenta sobre DI, como una buena práctica, ¿cuántas aplicaciones empresariales deberían tener dificultades o fallar hasta que sus desarrolladores aprendan la lección?

El segundo punto son los Estándares de la Industria . Si no va a enseñar MVC a los desarrolladores web, ¿está listo para enfrentar todas esas estructuras no estándar que necesita pasar algún tiempo para aprender su forma de hacer las cosas primero, y luego se da cuenta de que algunas de esas estructuras podrían Tiene una buena idea, pero la mayoría de ellos tendrán fallas de diseño serias que podrían tener serias consecuencias para su proyecto de software; incluso los marcos conocidos aún luchan con fallas de diseño de vez en cuando.

Pero, ¿qué pasaría si tenemos todas esas buenas ideas y las juntamos y esos desarrolladores inteligentes toman las cosas buenas de todos esos experimentos y crean una estructura realmente genial que funciona mejor para ese problema específico? Entonces acaba de crear los Patrones de diseño . Si eres una criatura viviente, entonces no hay otra forma de evitarlo; Incluso los animales siguen las mejores prácticas y patrones de diseño en su vida cotidiana.

Mahdi
fuente
3
"Aprendí mucho, pero todos ellos fueron básicamente infructuosos. Hice lo mejor que pude, pero ¿qué pasaría si no hubiera MVC por ahí? Bueno, simple, mi código fuente apesta" - ¡palabras de oro sólido!
ankush981
5

No reinvente un martillo, pero no trate cada problema como un clavo

Los patrones de programación ahorran mucho tiempo, ya que le brindan soluciones listas para usar, bien documentadas y probadas con casos medios que fácilmente podría olvidar. Pero necesita aprender (y pensar) cuándo usarlos.

Parafraseando tu pregunta: ¿aprender a conducir me haría mover más rápido o caminar más lento?

Aprender a usar el patrón de programación no significa que no debas ejercitarte para encontrar soluciones propias. Todavía habrá suficientes problemas para ejercitar tu creatividad. Conocer los patrones de programación solo te permitirá acelerar los problemas conocidos y concentrarte en aquellos que son menos triviales.

Volviendo a la segunda parte de su pregunta, ¿tiene razón su profesor o profesor?

Sí, él tiene razón . El objetivo principal de los estudios es aprender a los estudiantes a pensar . Deben tratar de encontrar sus propias soluciones al problema y luego enfrentarlas con las soluciones existentes. Solo de esa manera realmente pueden entenderlos. Si primero aprende los patrones, corre el riesgo de que solo aprendan mecánicamente a aplicarlos y no a comprender qué hay detrás.

Esta es la razón por la que primero enseña a los estudiantes a programar, y los patrones se introducen en semestres posteriores.

Marinero danubiano
fuente
5

Recomendaría absolutamente no enseñar programación mediante la enseñanza de patrones de diseño. No puede aplicarlos bien sin comprender los principios detrás de ellos, por lo que enseñar esos principios es mucho más importante.

De todos modos, tiendo a pensar que los patrones de diseño tampoco son tan valiosos para los programadores que trabajan. Si comprende completamente los principios involucrados en un patrón de diseño dado, entonces, en una situación en la que es una buena solución, naturalmente tenderá a construirlo (o algo similar) de todos modos, por supuesto, incluso si no lo sabía que era un patrón con un nombre Cualquier tiempo que pases aprendiendo patrones podría ser mejor gastado aprendiendo a pensar sobre el código en general. Si sus habilidades de "resolución de problemas en general" no están a la altura, entonces no puede escribir un buen código sin importar cuán bueno sea al aplicar algún conjunto de patrones. Y si sus habilidades de "resolución de problemas en general" son buenas, entonces puede resolver problemas incluso si no conoce un solo patrón.

También creo que en un mundo ideal no habría ser cualquier patrón de diseño, porque las ideas bastante común que se llama un patrón de todos sería bien implementado en las bibliotecas y nos gustaría ser en realidad la reutilización de código en lugar de constante reescritura de ella. Imagínese si hubiera un "patrón de diseño de expresión regular" que requiriera implementar un pequeño motor de expresiones regulares cada vez que quisiera usarlo. Los patrones de diseño son solo bibliotecas que no se pueden escribir porque el lenguaje no proporciona las instalaciones de abstracción correctas.

Esa es en realidad otra razón para no preocuparse demasiado por ellos; no son tan universales como a veces se afirma, pero de hecho están muy vinculados a las formas particulares de estructurar programas que un lenguaje en particular permite / fomenta. Un libro de patrones de diseño escrito para Python sería completamente diferente a uno escrito para Java, e incluso más diferente a uno escrito para un lenguaje no imperativo como Haskell. Es mejor comprenderlo a un nivel más profundo, y podrá descubrir patrones de diseño usted mismo en cualquier idioma con el que se familiarice.

Ben
fuente
Hmm, respuesta interesante. Pero escuché que las entrevistas de programación son pesadas en los patrones de diseño. ¿Por qué sería eso si hubiera poco valor en ellos?
ankush981
@dotslash Por la misma razón que las pruebas de coeficiente intelectual son pesadas en matemáticas / lógica: tienen algún valor y son fáciles de probar. Dicho esto, en mi búsqueda de trabajo como programador, no los encontré mucho en las entrevistas; Sin embargo, soy australiano, así que tal vez hay una diferencia en la moda.
Ben
Pero, ¿no es aprender sobre patrones de diseño una excelente manera de ver ejemplos concretos de cómo pensar sobre el código? ¿Qué cosas mirarías para aprender a pensar sobre el código, si no los problemas + las soluciones generales que resuelven los problemas y el código de ejemplo que implementa la solución?
Amy Blankenship
@Amy Sí, pero hay una gran diferencia entre "aquí hay un problema, aquí hay una solución, así es como se me ocurrió" y "aquí hay un patrón, memorízalo para que puedas aplicarlo a estos problemas en el futuro". Desea enseñar la capacidad de generar soluciones, porque los patrones solo pueden aplicarse alguna vez, por lo que necesitarán esa capacidad sin importar cuántos patrones conozcan. Si estuviera enseñando un curso que incluye patrones, probablemente lo haría estableciendo ejercicios diseñados para que los estudiantes noten por sí mismos que había conceptos comunes en las soluciones a los ejercicios.
Ben
Excelente respuesta El mejor entorno de programación encapsularía los patrones más interesantes en bibliotecas o lenguajes, liberando a los desarrolladores para trabajar en un nivel superior. También me gusta el punto sobre las dependencias del idioma; muchos patrones de diseño comunes son actualmente obsoletos.
Frank Hileman
3

El comercio y la educación tienen objetivos diferentes. Si estuviera enseñando a los estudiantes patrones de diseño, tomaría el mismo enfoque. Pero en un entorno de producción, el tiempo y la eficiencia lo son todo.

Además, la (macro) economía fuera del aula es una cosa diferente. ¿Ves a los gobiernos diciendo: "¡Vaya! Ahora estamos súper aburridos de hacer los impuestos y de la misma manera, así que intentemos algo súper loco esta vez"? No, no lo hace, porque tales experimentos salvajes pueden destruir la economía sin posibilidad de reparación. En cambio, tienden a apegarse a enfoques probados: aumentar la tasa de interés, anunciar exenciones de impuestos, etc. En otras palabras, se basan en patrones de diseño.

ankush981
fuente
1

La respuesta es, por supuesto, sí.

Los patrones de diseño son una herramienta de aprendizaje maravillosa en sí mismos, siempre que uno se tome el tiempo para descubrir cómo funcionan y por qué aportan el valor que aportan.

También pueden ser grandes impulsores de productividad al acelerar un proceso de diseño, ya que proporcionan soluciones familiares a problemas que surgen todo el tiempo.

Sin embargo, si provocan un cortocircuito en el diseño o las personas se vuelven dogmáticas y demasiado precisas sobre su uso, entonces tienen el efecto contrario.

Robar
fuente
3
son herramientas de enseñanza terribles para enseñar programación (en lugar de diseño). Conducen a la pregunta tan común en los foros de Internet de "cómo puedo implementar XXX usando el patrón AAA", que es una pregunta incorrecta, la pregunta debería ser (cuando quieres forzar patrones) "qué patrones serían apropiados para implementar XXX ".
Jwent
1
jaja, dije herramienta de aprendizaje, no herramienta de enseñanza, si uno quiere aprender;)
Rob
-2

Los patrones de diseño son, por supuesto, menos creativos. Esa es toda la idea. La creatividad es un recurso escaso. No debe desperdiciarlo en problemas que no necesitan creatividad. Es mucho más fácil, más rápido y más probable que funcione si resuelve un problema de la misma manera que cientos de desarrolladores anteriores. El código aburrido y poco emocionante que hace su trabajo es realmente bueno.

gnasher729
fuente
2
¿Es esta solo tu opinión o puedes respaldarla de alguna manera?
mosquito