Puedo escribir código ... pero no puedo diseñar bien. ¿Alguna sugerencia? [cerrado]

83

Siento que soy bueno escribiendo código en partes y piezas, pero mis diseños realmente apestan. La pregunta es, ¿cómo mejoro mis diseños y, a su vez, me convierto en un mejor diseñador?

Creo que las escuelas y las universidades hacen un buen trabajo al enseñar a las personas cómo ser buenos en la resolución de problemas matemáticos, pero admitamos el hecho de que la mayoría de las aplicaciones creadas en la escuela generalmente tienen alrededor de 1000 a 2000 líneas de largo, lo que significa que es principalmente un ejercicio académico que no refleja la complejidad del software del mundo real, del orden de unos cientos de miles a millones de líneas de código.

Aquí es donde creo que incluso los proyectos como topcoder / project euler tampoco serán de mucha ayuda, podrían agudizar su capacidad de resolución de problemas matemáticos, pero podría convertirse en un programador académico; alguien que está más interesado en las cosas agradables y limpias, que no está interesado en el día a día, las cosas mundanas y peludas con las que se ocupan la mayoría de los programadores de aplicaciones.

Entonces, mi pregunta es ¿cómo mejoro mis habilidades de diseño? Es decir, la capacidad de diseñar aplicaciones de pequeña / mediana escala que se incluirán en unos pocos miles de líneas de código. ¿Cómo puedo aprender habilidades de diseño que me ayuden a construir un mejor kit de editor html o algún programa de gráficos como gimp?

usuario396089
fuente
1
"admitamos el hecho de que la mayoría de las aplicaciones creadas en la escuela generalmente tienen alrededor de 1000 a 2000 líneas de largo, lo que significa que es principalmente un ejercicio académico que no refleja la complejidad del software del mundo real": donde estaba enseñando teníamos dos proyecto de software semestral en el que un equipo de diez estudiantes desarrolló una aplicación bastante compleja durante un período de 6 a 8 meses. Además, muchas empresas (al menos en Alemania) ofrecen contratos cortos para estudiantes que desean practicar un poco antes de completar sus estudios.
Giorgio

Respuestas:

87

La única manera de llegar a ser realmente bueno en algo es intentarlo, fallar espectacularmente, volver a intentarlo, fallar un poco menos que antes y, con el tiempo, desarrollar la experiencia para reconocer las causas de sus fallas y poder manejar las posibles situaciones de falla más adelante. Esto es tan cierto para aprender a tocar un instrumento musical, conducir un automóvil u obtener algo de PWN-age serio en su juego de disparos en primera persona favorito, como lo es aprender cualquier aspecto del desarrollo de software.

No hay atajos reales, pero hay cosas que puede hacer para evitar que los problemas se salgan de control mientras adquiere experiencia.

  • Identifica un buen mentor . No hay nada mejor que poder hablar sobre sus problemas con alguien que ya ha pagado sus cuotas. La orientación es una excelente manera de ayudar a acelerar el aprendizaje.
  • Lea , lea un poco más, practique lo que ha estado leyendo y repita durante toda la vida de su carrera. He estado haciendo esto durante más de 20 años, y todavía me gusta aprender algo nuevo todos los días. Aprenda no solo sobre diseño inicial, sino también sobre diseño emergente, pruebas, mejores prácticas, procesos y metodologías. Todos tienen diferentes grados de impacto sobre cómo surgirán, se darán forma sus diseños y, lo que es más importante, cómo durarán con el tiempo.
  • Encuentra tiempo para jugar . Participe en un proyecto de trabajo de mofeta a través de su lugar de trabajo o practique en su propio tiempo. Esto va de la mano con su lectura, poniendo en práctica sus nuevos conocimientos y viendo cómo funcionarán esas cosas. Esto también es lo que hace una buena discusión con su mentor.
  • Obtener involucrado con algo técnico fuera de su lugar de trabajo. Esto podría ser un proyecto o un foro. Algo que le permitirá poner a prueba sus teorías e ideas fuera de su círculo inmediato de pares con el fin de mantener una nueva perspectiva sobre las cosas.
  • Se paciente . Reconozca que ganar experiencia lleva tiempo y aprenda a aceptar que necesita retroceder un tiempo para saber por qué y dónde ha fallado.
  • Mantenga un diario o un blog de sus tareas, sus pensamientos, sus fracasos y sus éxitos. Esto no es estrictamente necesario, sin embargo, he descubierto que puede ser de gran beneficio para usted ver cómo se ha desarrollado con el tiempo, cómo han crecido sus habilidades y sus pensamientos han cambiado. Vuelvo a mis propios diarios cada pocos meses y miro las cosas que escribí hace 4-5 años. Es una verdadera revelación descubrir cuánto había aprendido en ese momento. También es un recordatorio de que me equivoco de vez en cuando. Es un recordatorio saludable que me ayuda a mejorar.
S.Robins
fuente
45
+1 para probar y fallar. Porque cuando no entiendes por qué hay un patrón de diseño, no puedes usar ese patrón de manera efectiva.
Mert Akcakaya
2
+1 gran respuesta, pero encuentro que es algo incompleto. Creo que la contribución más importante con diferencia sería tener un muy buen apetito por la refactorización. Escriba, mire lo que dice la teoría (artículos, libros o mentor), refactorice / reescriba, vuelva a la teoría, refactorice / reescriba; esto le dará tiempo para concentrarse en la estructura, mientras trabaja con código familiar. Sé tu peor crítico. También diría que es muy importante que nunca pierdas el apetito por revisar constantemente tu propio trabajo.
vski
1
@vski Hay muchos conceptos que podría haber incluido, pero la pregunta es si esos conceptos proporcionarían por sí mismos un camino razonable para obtener la experiencia necesaria para que el OP se considere a sí mismo un diseñador mejorado. En el alcance de mi respuesta, veo la refactorización como una práctica (según mi segundo punto). Así también está practicando Clean Code, Test First, BDD y muchos otros conceptos. He adoptado el enfoque de que se necesitan muchas habilidades y experiencias para desarrollar hasta el punto en que las habilidades de diseño emerjan y crezcan, con la experiencia y el conocimiento adquiridos, con el tiempo. :)
S.Robins
2
+1 por conseguir un mentor. Idealmente, haga que su mentor haga revisiones de código con usted. Tener a alguien más que lea y critique su código realmente puede ayudarlo cuando se trata de un diseño mejor y más limpio.
Leo
2
"Alguna vez lo intentaste. Alguna vez falló. No importa. Inténtalo de nuevo. Falla de nuevo. Falla mejor". --- Samuel Beckett.
Peter
16

Bueno, no hay una manzana de oro para este tipo de preguntas, y creo que tal vez sea para que cada codificador encuentre lo que es adecuado para él. Aquí está mi opinión, de todos modos.

Usted podría leer libros sobre el tema. Grandes libros Libros fantasticos. Pero creo que estos libros solo lo ayudan una vez que ha intentado crear y diseñar una aplicación, y ha fallado.

Para mí, todo se trata de experiencia. Cuando comencé como novato, leía libros sobre cómo diseñar. No entendía mucho del contenido en aquel entonces. Cuando comencé a trabajar y tuve que diseñar aplicaciones yo mismo, hice aplicaciones muy desordenadas. Funcionaron, pero fueron un dolor de mantenimiento. Luego volví a leer esos libros, y esta vez los entendí mejor.

Ahora, sigo cometiendo nuevos errores y aprendiendo de los viejos.

Amadeus Hein
fuente
10
Hay un gran punto aquí que vale la pena mencionar: siga cometiendo nuevos errores; no sigas cometiendo los mismos viejos errores: aprende de ellos y haz algo nuevo.
Bevan
11

Deja de diseñar y aprende a refactorizar el código. El desarrollo incremental con refactorización continua y agresiva dará como resultado un producto final mucho más limpio que cualquier diseño inicial.

Kevin Cline
fuente
2
El diseño emergente es algo hermoso en mi humilde opinión, sin embargo, sin disciplina, corre el riesgo de crear "espagueti emergente". El problema con el diseño inicial es que la gente lo ve como una propuesta de todo o nada, lo que le da una mala reputación cuando las cosas van mal. Esto me recuerda uno de los artículos de Joel donde menciona que el diseño es importante. Sin embargo, lo que se necesita es suficiente por adelantado para que un diseño marque la diferencia sin que le robe tiempo, recursos y su oportunidad de ver hermosos diseños de soporte emerger orgánicamente a través de un código limpio.
S.Robins
@ S.Robins: Sentí que el OP todavía está atacando proyectos lo suficientemente pequeños como para completarse muy bien con TDD y refactorización continua. De este modo, puede aprender la disciplina necesaria para saber cuánto diseño se necesita para proyectos más complejos.
Kevin Cline
Pensé que ese podría ser el caso, sin embargo, sentí que podría valer la pena agregar un contador a la implicación de que "cualquier diseño inicial" será potencialmente peor que algo que es puramente emergente. Sin embargo, estoy de acuerdo en que la forma de construir la experiencia necesaria que busca el OP es preocuparse menos al principio por el diseño y centrarse en escribir código bien factorizado y limpio. :-)
S.Robins
No estoy de acuerdo en que la refactorización siempre conduzca al mejor diseño. Por supuesto, la refactorización a menudo le permite explorar y comprender el problema, pero un buen diseño no siempre surge de forma incremental a través de la refactorización. A veces, ve una solución mucho mejor y se da cuenta de que su código actual está tan lejos de él que la reescritura es mucho más rápida que la refactorización.
Giorgio
Tuve esta experiencia recientemente: seguí refactorizando y refactorizando y entrando en un círculo con los mismos problemas una y otra vez: estaba usando iteradores para codificar algo y el código seguía siendo demasiado complejo. Luego decidí olvidarme de los iteradores y tuve que reescribir gran parte del código, pero la lógica se volvió mucho más clara y concisa que antes. No sé si llamarían a esto "refactorización agresiva": la estructura general de la aplicación no se modificó, pero algunas partes fundamentales simplemente se descartaron y se reescribieron desde cero.
Giorgio
7

Lea sobre patrones, claro, pero antes que nada lea sobre antipatrones. Reconocer los antipatrones es importante, y es más fácil entender por qué algo no debe hacerse de tal manera que por qué debería hacerse.

Ver http://sourcemaking.com/antipatterns/software-development-antipatterns por ejemplo.

Escriba el código para que pueda ajustarse rápidamente si los requisitos cambian (lo cual es muy común en el entorno de producción).

Sea súper escéptico sobre agregar "solo un pequeño truco más" Uno más aquí, uno más allá, y el código se vuelve imposible de mantener.

Valorar el principio abierto / cerrado .

Escribir pruebas (como en TDD). Te obligan a pensar en tu diseño incluso antes de implementarlo.

Explore el código de proyectos de código abierto (es decir, de tamaño razonable). Solía ​​sorprenderme, por lo general, ver tantos niveles de abstracción. Ahora entiendo que no es arte por el arte, hay una razón por la que se hace de esta manera.

Konrad Morawski
fuente
4

Un principio que considero muy importante para un buen diseño es la descomposición: si una clase es demasiado grande (más de, digamos, 300-400 líneas de código), divídala en clases más pequeñas; si un método es demasiado grande (digamos, más de 50 líneas de código) descomponerlo; Si un proyecto contiene más de 50 clases, descomponga.

La clave es estimar el tamaño de su sistema y construir varias capas de abstracción (por ejemplo, subsistema, aplicación, proyecto, módulo, clase, método) que le permitan descomponer su código en unidades comprensibles con relaciones claras entre ellos y pocas dependencias.

Giorgio
fuente
1
Si bien hay algún mérito en su sugerencia, las líneas de código realmente no importan, el comportamiento sí lo hace. Si su método está haciendo más de una cosa, probablemente sea hora de refactorizarlo. Si eso es solo llamar a métodos que hacen una cosa por sí mismos y unirlos, está bien.
jer
1
@jer: Es una regla general, por supuesto. Un método que llama a otros 100 métodos es, como usted dice, simplemente unir cosas (está llamando a una lista de subfunciones). Estoy más pensando en métodos que contienen cierta lógica real: normalmente es una mala señal si tienes que desplazarte mucho de un lado a otro para comprender lo que está haciendo un método. Lo mismo si observa una definición de clase con muchos miembros (y la clase no es solo una gran colección plana de propiedades).
Giorgio
"el proyecto contiene más de 50 clases, descomponerlo" no es serio
dinámico
@ yes123: estaba destinado a dar una idea. Realmente depende de lo que estés desarrollando, en qué idioma, etc.
Giorgio
Creo que sería sensato tener en cuenta que esto no ayudará para el diseño inicial (ya que está refactorizando), pero ayudará a aprender patrones y mejores prácticas que mejorarán sus diseños futuros.
Craig Bovis
0

Es difícil, de lo que realmente estamos hablando es de la capacidad de abstraer en lugar de crear un mejor código, pero dos cosas lo harán mejor y una cosa lo hará más feliz:

"Mejor"

A) Encuentre el mejor diseñador que pueda y empareje el programa / haga un diseño juntos. Pídales que expliquen lo que están pensando mientras abordan el problema, no se conforme con "simplemente se siente bien" y siga investigando. Ese proceso también ayudará a la fiesta de "tutoría"

B) Imagina todo como actores individuales y conversaciones entre ellos. Cada uno de los actores debe tener un solo rol / responsabilidad y grupos de ellos manejan diferentes sistemas. Si esa conversación funciona y cada actor se siente coherente y cohesivo, entonces estás en camino.

Y "más feliz"

C) Si ha hecho todo lo posible y todavía no está sucediendo, entonces no hay nada de malo en aceptar que algunas personas no pueden hacer algunas cosas. Podrías escribir código apretado y brillante, pero nunca ser capaz de diseñar o diseñar. ¿Y qué? No puedo practicar deportes físicos por el caramelo, no soy guapo y la conducción de mi automóvil nunca será mejor que el promedio. Disfruta y utiliza en lo que eres bueno.

Stuart Muckley
fuente
-1

En mi experiencia personal, leer el código de otros es una buena fuente de "inspiración". Me refiero a tratar de entender los diseños de otras personas y preguntarte por qué él / ella hace las cosas de esa manera.

puedes encontrar muchos proyectos de código abierto para investigación.

de todos modos necesitas práctica.

PCJ
fuente
-1

No vivas con miedo

Lucha por la simplicidad

Escucha a tus usuarios

Prueba muchas ideas

Crea algo, luego hazlo mejor

Trabaja en cosas que agregan valor, abandona cosas que no

Erturne
fuente
-1

Aprende a hacer las preguntas correctas. La mayoría de las veces mejorará su diseño al ver el problema desde un ángulo diferente. En particular, esto le ayudará a dejar de centrarse en resolver el problema en cuestión y buscar más soluciones que resuelvan múltiples problemas relacionados.

Craig Bovis
fuente