2009-03-02 9 views
8

a menudo me encuentro luchando manipulación excesiva - la persona encargada de diseñar el software viene con una arquitectura que es, muy, muy complicada demasiado.¿Cómo luchas contra la complejidad del diseño?

Está bien tener todas las características esotéricas que los usuarios nunca conocerán y obtener esa sensación de logro cuando estás haciendo algo que todos los artículos de la revista te dicen es lo último y genial, pero se va a gastar la mitad de nuestro tiempo de ingeniería en este monumento a nuestra inteligencia, y no, ya sabes, el producto real que necesitan nuestros usuarios y la alta dirección espera que esté terminado en un plazo razonable o al menos un marco de tiempo limitado.

Y es probable que sólo tiene que volver a la solución más simple de todos modos cuando se inicia acabando el tiempo, es decir, si le da esa oportunidad.

Todos hemos escuchado el estribillo: Keep It Simple, Stupid ™.

¿Cómo se pelea con la sobrecomplejidad en su equipo?


Un ejemplo que he tenido que trabajar con varias ocasiones últimamente es cuando la decisión ha sido tomada para ir a un diseño de base de datos completamente desnormalizado en lugar de un RDBMS. "¡porque es más rápido!" bases de datos no normalizados son totalmente muy duro para hacerlo bien, y sólo son adecuados para los problemas de datos muy especializados como Flickr o eBay, y que puede ser muy costoso en términos de tiempo de desarrollo en relación con el resto de su desarrollo.

Respuesta

12

uñas y dientes, ya veces se pierde. El problema es que siempre es fácil caer en la tentación de construir algo enfríe.

¿Por qué construir algo simple y eficiente cuando puede ser complicado y maravilloso?

Trate de recordar a la gente de la regla XP de la construcción de la cosa más simple que se puede trabajar.

+2

De acuerdo. Personalmente, encuentro mucha belleza en el código corto y simple. Es fácil arrojar un montón de código a un problema, pero es mucho más difícil resolver un problema de una manera corta y * clara *. – Kevin

+5

¡La perfección se logra no cuando no hay nada más que agregar, sino cuando no hay nada más que llevar! – Rook

+0

http://en.wikipedia.org/wiki/Ockham_razor – meade

1

usted puede sufrir de "demasiados arquitectos en el equipo" síndrome. Una o dos personas como máximo deben diseñar/diseñar un sistema que será codificado por un equipo de 5 a 10 personas. La entrada es bienvenida de todos, pero los responsables de la toma de decisiones arquitectónicas deben ser pocos y con experiencia.

(los números son semi-aleatoria y puede ser diferente dependiendo de otros factores también)

0

Trato de ser abierta cuando se habla de cuestiones. Pero cuando estoy discutiendo con alguien entre algo que parece simple y otro complicado, me vuelvo tan terco como puedo. Ayuda mucho, siempre y cuando seas muy coherente de una decisión a otra.

2

Supongo que quiere decir "diseño de base de datos completamente desnormalizado en lugar de un modelo normalizado (por ejemplo, tercera o cuarta forma normal)", porque un modelo relacional es administrado por un RDBMS independientemente de su normalización.

no se puede juzgar sin saber más acerca de sus necesidades, sus capacidades y las de sus compañeros de equipo.

temo que su advertencia de KISS podría no funcionar en este caso, debido a que uno grande, mesa de desnormalizado podría ser defendida como la cosa más simple posible.

¿Cómo se resuelve a nadie este tipo de problemas?Comunicación, persuasión, mejores datos, prototipos de tecnologías y técnicas alternativas. Esto es lo que hace que el desarrollo de software sea tan difícil. Si hubiera una sola forma de hacer estas cosas, y todos estuvieran de acuerdo, realmente podríamos crear un script o hacer que alguien desarrolle sistemas y terminar con eso.

Obtenga algunos datos. Tus palabras pueden no ser suficientes. Si un prototipo rápido puede demostrar su punto, créelo.

"Las opiniones firmes, livianas" deberían ser su lema.

A veces un punto técnico no vale la pena enajenar a todo su equipo. A veces lo es. Tu llamada.

+0

Podría argumentar que la desnormalización completa es más simple en la concepción. Construir algo que realmente funcione con él actualmente no lo es, IMO. –

+0

Ahí es donde entra en juego la persuasión: tendrás que inventar el argumento que lleva el día en contra del DBA. Preferiría una gran mesa. Usted no es un DBA. ¿Qué autoridad tendrás? Los datos ayudarán a enfocarse en el problema y quitárselo a usted y a las personas involucradas. – duffymo

4

Al menos para mí, el problema más grande es que a menudo es difícil saber qué función hay allí debido a su bondad empresarial de revista, amistosa y que está allí porque agrega un nivel de flexibilidad que será útil en el futuro.

Se ha demostrado que, en general, las personas son terribles al anticipar la complejidad futura y los efectos colaterales de las decisiones actuales. Desafortunadamente, esto no siempre significa que lo más simple es lo mejor; en mi caso, hubo muchas cosas que pensé que eran demasiado complicadas al principio y que no vieron el valor hasta mucho más tarde (er ... primavera). También las cosas que pensé tenían sentido y resultaron ser extremadamente complicadas (EJB1). Entonces sé que mi intuición sobre estas cosas es defectuosa.

La mejor apuesta: cualquier clase de capa indirecta debe ser respaldada con un argumento que respalde el valor de la flexibilidad que agrega frente a su complejidad de desarrollo adicional.

Sin embargo, las personas que mantienen dogmáticamente una configuración particular de base de datos por motivos abstractos probablemente estén en el campo de "construirlo porque he leído que es lo correcto". Puede ser poco realista, pero algunas personas podrían estar convencidas si construyes una versión de prueba y un punto de referencia, especialmente si los resultados muestran un mayor esfuerzo que lleva a un aumento de rendimiento insignificante.

3

Es todo lo fino y elegante para tener todas las características esotéricos que los usuarios nunca se conocen y ...

esto sería feature creep, no innecesariamente complicado diseño. Es diferente de tu ejemplo en las bases de datos.

Un ejemplo que he tenido que trabajar con en varias ocasiones últimamente es cuando la decisión se ha hecho para ir a un diseño totalmente sin normalizar la base de datos en lugar de un RDBMS. "¡porque es más rápido!"

En este caso, pueden estar sucediendo varias cosas. Una de ellas es que puede estar equivocado y estas personas realmente podrían saber lo que dicen porque han trabajado con ejemplos muy similares. Otra es que podrían estar equivocados, es decir, su diseño no ofrece las ventajas de velocidad que afirman. En este caso, podría haber dos situaciones diferentes: (1) Están dando demasiado peso a la velocidad en su diseño, o (2) la velocidad es realmente crítica. Si la velocidad es realmente tan relevante, el equipo no debe confiar solo en suposiciones, deberían probar diferentes prototipos y evaluar su velocidad en las rutas críticas. No se construye un coche de F1 de una manera simplemente "porque es más rápido", sino que se siguen probando varias soluciones de diseño alternativas y se elige la más rápida que aún no aumenta demasiado los costos de mantenimiento.

A veces se puede discutir y llegar a un acuerdo, a veces no se puede. Es la vida.

Una última palabra, sin embargo. Usted no pelea complejidad. Tú lo tratas Identifica las cosas realmente importantes y actúa en consecuencia.

+0

No es un deslizamiento de características si está diseñado desde el primer día. –

+0

@David Locke hmm, buen punto. Tal vez "featuritis"? O crearé un nuevo concepto y lo nombraré después de mí :) –

0

Su ejemplo no es realmente un diseño complicado, es una opción de diseño con la que no está de acuerdo. Ya que está trabajando en el código, podría tener razón porque muchas de estas decisiones las toma la gente que lee un artículo en un artículo y piensa que suena como un buen objetivo, o la decisión podría haber sido tomada por alguien que se topó con problemas antes y estaba tratando de evitar que vuelva a suceder.

Personalmente he hecho muchas cosas de la manera fácil y en gran medida de la manera difícil, y nunca me alegro cuando elijo hacer algo de la manera fácil por el camino difícil. Ahora aprendí trucos como "nunca pasear por una colección desnuda, siempre envuélvela en una clase de negocios".

Si tuviera que explicar el razonamiento detrás de eso a alguien que no había pasado por las mismas experiencias, no lo entenderían hasta que intentaran comparar el "camino fácil" con el "camino difícil" unas pocas veces.

0

La solución no debería ser más compleja que el problema.

La pregunta se entrelaza con la idea de la complejidad esencial. Un tipo debe tocar cada elemento, por su esencia. ¿Cuán más complejo debe llegar a ser, para resolver el problema, dadas las limitaciones técnicas que existen en él?

0

¿Las personas involucradas tienen suficiente tiempo e incentivo para encontrar una solución simple? Sin cuidado, la complejidad aumentará. Si pasas la mayor parte de tu tiempo intentando hacer la corrección de errores o la función más rápida posible, decir "mantenerlo simple" no será suficiente.

Asegúrese de que haya personas en el equipo con heridas de guerra por mantener programas grandes y personas con experiencia en refactorización, y luego deles tiempo para ordenar el software. Si puede organizar ciertas funciones y oportunidades que están fuera del alcance, eso ayudará a las personas a eliminar el código innecesario. Si quieres una métrica, intenta reducir las líneas de código; pero trata de no obsesionarte con eso. Mejorar la cobertura de la prueba; considere eliminar bits de código que son difíciles de probar.

0

No intente hacer todo de un tirón. Divide cada problema/tarea en trozos manejables. Luego, prioriza, teniendo KISS y YAGNI en mente. Esto te ayudará a concentrarte en construir lo que necesitas . Si lo ha hecho bien, tendrá un buen núcleo que puede agregar más adelante, dado el tiempo, dinero, recursos e inspiración.

2

: luchas de otra persona overdesign/invasión de características de varias maneras:

  1. solicitud prioritaria función, sobre la base de necesidades de los usuarios reales. Simulacros de funciones para verificadores alfa y beta, y pregunta si cambiarían N meses de retraso por ello.

  2. Reorganice agresivamente para evitar el revestimiento especial. Divida el código en capas o componentes modulares cuando sea apropiado. Encuentre un equilibrio entre "funciona bien ahora" y "fácil de extender más tarde".

  3. Notifique a su administración cuando no esté de acuerdo con las decisiones de diseño, prepárese para ser rechazado y acepte la decisión. No revises el código de sabotaje ni la cabeza de nadie.

6

Asegúrese de rebatir cualquier idea que tenga de otra persona. A menudo, nos involucramos tanto en hacer las cosas de una manera determinada que hace falta otro par de ojos para enderezarlo. Ha habido muchas veces que me he dado cuenta de los problemas difíciles por tener otra persona puede decir "es lo que realmente necesitamos eso?" Esto ayuda a que mi código sea más simple.

En el punto de tratar con la gente que está en desacuerdo con, Ward Cunningham tiene un buen punto:

Fue un punto de inflexión en mi carrera de programación cuando me di cuenta de que yo no tenía que ganar cada discusión . Estaría hablando sobre el código con alguien, y yo diría: "Creo que la mejor manera de hacerlo es A." Y ellos decían: "Creo que la mejor manera de hacerlo es B. Yo diría:" Bueno, no, es realmente A. "Y ellos dirían," Bueno, queremos hacer B. "Era un punto de inflexión para mí cuando pude decir: "Bien. Haz B. No nos va a doler tanto si me equivoco. No nos hará tanto daño si estoy en lo cierto y si haces B, porque podemos corregir los errores. Entonces veamos si es un error. ... Por lo general, resulta ser C. Es una experiencia de aprendizaje para los dos. Si decidimos sin la experiencia, ninguno de nosotros realmente aprende. Ward ganó, y alguien más no. O viceversa. Es demasiada batalla. Por qué no decir: "Bueno, vamos a codificarlo y ver qué pasa. Si no funciona, lo cambiaremos". "

¿Mi consejo? Si quieres hacer algo mejor, ven con un prototipo simple que demuestra que es mejor. Las opiniones son geniales, pero el código habla.

+0

+1 - cosas maravillosas. – duffymo

2

La mejor manera que he encontrado es preguntar sin descanso - una y otra vez - '¿Cuál es el problema de negocios que estamos tratando de resolver' y '¿Cómo ayuda esta decisión a resolver ese problema?'

Me parece que con demasiada frecuencia la gente recurre a las soluciones en lugar de ser muy claro sobre cuál es el problema.

Así que en su ejemplo de cómo organizar una base de datos, mi pregunta sería '¿Qué creemos que son los requisitos de transacción para este proyecto hoy en día, el próximo mes, el próximo año, dentro de cinco años'. Podría ser que tiene sentido gastar mucho tiempo para obtener el modelo de datos correcto, podría ser una pérdida de tiempo. No sabe cuáles son los parámetros hasta que aclare la definición del problema.

6

he visto esta fórmula en alguna parte:

skill = complexity of problem/complexity of solution http://img39.imageshack.us/img39/1586/whatisskill.png

En otras palabras, se requiere habilidad para crear una solución sencilla a un problema complejo. Si alguien deliberadamente diseña y se enorgullece de las complejas soluciones sopesadas, entonces es inconscientemente incompetente.

Personalmente, lo que me ayuda a mantener mis diseños simples, es el ciclo de TDD. Primero, escriba una prueba que especifique a qué intenta llegar y luego produzca "the simplest thing that could possibly work". Y de vez en cuando, reflexiona sobre lo que has producido y piensa en cómo hacerlo más simple.

Nunca construir capas de abstracción y flexibilidad adicionales en el sistema, hasta que es requerido por algo que tienes ahora. Cambiar el código es fácil, cuando se tiene un buen conjunto de pruebas de unidad, por lo que puede agregar esas capas de abstracción más tarde, cuando surja la necesidad, si es que alguna vez se presenta. De lo contrario, "you ain't gonna need it".

Algunos síntomas de diseño son demasiado complejos al escribir pruebas es complicado.Si las pruebas requieren un código de configuración largo, tal vez tenga demasiadas dependencias o, de alguna otra manera, demasiada complejidad. Si se encuentra con errores de concurrencia, entonces tal vez debería pensar en cómo diseñar el sistema para que la concurrencia se restrinja al número mínimo absoluto de clases. Tal vez use una arquitectura de paso de mensajes, como el modelo Actor, y haga que prácticamente todos los componentes tengan un solo hilo, aunque el sistema en su conjunto tenga varios hilos.

Cuestiones relacionadas