2008-09-17 11 views
12

Muchas veces nos encontramos trabajando en un problema, solo para descubrir que la solución que se está creando es mucho más compleja de lo que el problema requiere. ¿Existen controles, mejores prácticas, técnicas, etc. que lo ayuden a controlar las complicaciones en su lugar de trabajo?¿Cómo previene soluciones o diseños complicados?

+1

Mirando la primera respuesta, no creo que esta deba ser una wiki de la comunidad. Gran Q, excelente A. –

Respuesta

12

Conseguir que alguien nuevo lo mire.

5

Si es demasiado difícil de probar, su diseño es demasiado complicado. Esa es la primera métrica que uso.

0

Es inevitable que una vez que haya sido programador esto suceda. Si realmente ha subestimado el esfuerzo o ha llegado a un problema en el que su solución simplemente no funciona, entonces detenga la codificación y hable con su gerente de proyecto. Siempre me gusta llevar las soluciones conmigo a la reunión, el problema es A, puede hacer x, lo que tomará 3 días o podemos intentarlo, lo que demorará 6 días. No hagas la elección tú mismo.

2

Creo un diseño, etc., y luego lo miro y trato de quitar (agresivamente) todo lo que no parece ser necesario. Si resulta que lo necesito más tarde cuando estoy puliendo el diseño, lo vuelvo a agregar. Lo hago en varias iteraciones, refinando a medida que avanzo.

0
  • Hable con otros programadores en cada paso del camino. Cuantos más ojos haya en el diseño, más probable es que un aspecto sobrecomplicado se revele antes de que se vuelva demasiado osificado en la base del código.
  • Constantemente, pregúntese cómo usará lo que sea que esté trabajando actualmente. Si la respuesta es que no está seguro, deténgase a repensar lo que está haciendo.
  • Me ha resultado útil anotar ideas sobre cómo simplificar potencialmente algo en lo que estoy trabajando actualmente. De esa manera, una vez que realmente lo tengo funcionando, es más fácil regresar y refactorizar o rehacer según sea necesario en lugar de jugar con algo que aún no es funcional.
0

Este es un delicado acto de equilibrio: por un lado, no desea algo que tarde demasiado en diseñarse e implementarse, por otro lado, no desea un truco que no sea lo suficientemente complicado para lidiar con el problema de la próxima semana o, incluso peor, requiere una nueva redacción para adaptarse.

Un par de técnicas que encuentro útil:

Si algo parece más compleja de lo que le gustaría a continuación, nunca se sientan a poner en práctica tan pronto como haya terminado de pensarlo. Encuentre algo más para hacer por el resto del día. Numerosas veces termino pensando en una solución diferente a una parte temprana del problema que elimina gran parte de la complejidad más adelante.

En una línea similar, tiene a alguien más a quien le puede sacar ideas. ¡Asegúrate de explicarles por qué la complejidad está justificada!

Si está agregando complejidad porque cree que se justificará en el futuro, intente establecer cuando en el futuro lo utilizará. Si no puede (realistamente) imaginar que necesita la complejidad durante un año o tres, entonces probablemente no sea justificable pagar ahora.

1

La prueba primero puede ayudar aquí, pero no es adecuado para todas las situaciones. Y no es una panacea de todos modos.

Comience pequeño es otra gran idea. ¿De verdad necesitas rellenar los 10 patrones de diseño en esta cosa? Intenta primero hacerlo "de manera estúpida". No acaba de cortarlo?De acuerdo, hazlo "de una manera un poco menos estúpida". Etc.

Haz que tu reseña. Como alguien más escribió, dos pares de ojos son mejores. Aún mejor son dos cerebros. Es posible que tu pareja solo vea un espacio para la simplificación, o un área problemática que pensabas que estaba bien simplemente porque pasas muchas horas pirateándola.

Utilice lenguaje simplificado. Los lenguajes como Java, o algunas veces C++ a veces parecen alentar soluciones desagradables y complicadas. Las cosas simples tienden a abarcar múltiples líneas de código, y solo necesita usar 3 bibliotecas externas y un gran marco para administrarlo todo. Considere usar Python, Ruby, etc., si no fuera por su proyecto, entonces para un uso privado. Puede cambiar su forma de pensar para favorecer la simplicidad, y para estar seguro de que la simplicidad es posible.

2

Lea "Trabajando eficazmente con código heredado" por Michael C. Feathers.

El punto es que, si tiene un código que funciona, y necesita cambiar el diseño, nada funciona mejor que hacer que su unidad de código se pueda probar y dividir el código en partes más pequeñas.

5

En mi experiencia, el diseño para un caso excesivamente general tiende a generar demasiada complejidad.

La cultura de ingeniería alienta diseños que hacen menos suposiciones sobre el medio ambiente; esto generalmente es algo bueno, pero algunas personas lo llevan demasiado lejos. Por ejemplo, podría ser agradable si el diseño de su automóvil no supone una atracción gravitacional específica, nadie va a conducir su automóvil en la luna, y si lo hicieran, no funcionaría, porque no hay oxígeno para hacer que el combustible arda

La parte difícil es que el tipo que se desarrolla la "trabaja-en-cualquier-planeta" El diseño es a menudo considerado como inteligente, por lo que es posible que tenga que trabajar más para argumentar que su diseño es demasiado inteligente.

Comprender las ventajas y desventajas, para que pueda tomar la decisión entre suposiciones buenas y suposiciones erróneas, contribuirá en gran medida a evitar un diseño innecesariamente complicado.

0

Reduzca la cantidad de datos con los que está trabajando serializando la tarea en una serie de tareas más pequeñas. La mayoría de las personas solo puede tener media docena (más o menos) condiciones en la cabeza mientras codifica, por lo tanto, conviértelos en la unidad de implementación. Diseñe para todas las tareas que necesita realizar, pero luego corte sin piedad el diseño para que nunca tenga que jugar con más de media docena de rutas a través del módulo.

Esto se desprende de la publicación de Bendazo: simplifíquelo hasta que sea fácil.

3

Aquí están algunas ideas para un diseño más simple:

  • leer algunos libros y artículos de programación, y luego aplica ellos en su trabajo y escribir código
  • leer mucho código (buenas y malas) escrito por otras personas (como proyectos de código abierto) y aprende a ver qué funciona y qué no
  • crear redes de seguridad (pruebas unitarias) para permitir las experimentaciones con tu código
  • usar el control de versiones para habilitar la reversión, i f esas experimentaciones toman el camino equivocado
  • TDD (test driven development) y BDD (behaviour driven development)
  • cambiar su actitud, pregunte cómo puede hacer que sea así, que "simplemente funciona" (convención sobre configuración podría ayudar allí; o preguntar cómo Apple podría hacerlo)
  • la práctica (como los músicos de jazz - mermelada con código, intente Code Kata)
  • escritura mismo código varias veces, con diferentes lenguajes y después de algún tiempo ha pasado
  • aprender nuevos idiomas con nuevos conceptos (si usa lenguaje estático, aprenda uno dinámico, si usa lenguaje de procedimiento, aprenda uno funcional; ...) [un idioma por año es más o menos]
  • solicite a alguien que revise su código y pregunte activamente cómo puede hacer su código más simple y más elegante (y luego hacerlo)
  • obtener años bajo el cinturón por encima haciendo cosas (tiempo ayuda a la mente activa)
0

pido a mis clientes qué que necesitan alguna característica. Intento llegar al final de su solicitud e identificar el problema que están experimentando. Esto a menudo se presta a una solución más simple de lo que yo (o ellos) pensarían.

Por supuesto, si conoce los hábitos de trabajo de sus clientes y los problemas que tienen que enfrentar, puede comprender sus problemas mucho mejor desde el primer momento. Y si los "conoces", los conoces, entonces entiendes mejor su discurso. Por lo tanto, desarrolle una relación de trabajo cercana con sus usuarios. Es el paso cero de la ingeniería.

0

Tómese el tiempo para nombrar los conceptos del sistema y encontrar nombres que estén relacionados, esto hace que el sistema sea más familiar. No dude en renombrar conceptos, cuanto mejor sea la conexión con el mundo que conoce, mejor podrá trabajar con su cerebro.

Pida las opiniones de las personas que reciben sus impulsos de soluciones simples y limpias.

Solo implemente los conceptos necesarios para el proyecto actual (un deseo de pruebas futuras o sistemas genéricos hace que su diseño se hinche).

2

El uso de Test Driven Development y después de Three Rules of TDD Robert C. Martin:

  1. No está autorizado a escribir ningún código de producción a menos que sea para hacer un pase de prueba de unidad que falla.
  2. No está permitido escribir más de una prueba unitaria que la suficiente para fallar; y las fallas de compilación son fallas.
  3. No está permitido escribir ningún código de producción más de lo que es suficiente para pasar la prueba de la unidad que falla.

De esta forma, no es probable que obtenga muchos códigos que no necesita. Siempre te concentrarás en hacer que una cosa importante funcione y nunca te adelantarás en términos de complejidad.

Cuestiones relacionadas