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?
fuente
Respuestas:
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.
fuente
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á.
fuente
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.
fuente
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.
fuente
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.
fuente
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.
fuente
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.
fuente
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.
fuente