¿Es normal pensar en un problema de diseño durante días sin código escrito? [cerrado]

52

A veces miro fijamente al espacio o bosquejo ideas y escribo algunos pseudocódigos en papel. Luego lo tacho y comienzo de nuevo, luego, cuando creo que tengo la solución correcta para el problema, comienzo a escribir el código.

¿Es normal pensar durante días sin escribir ningún código? ¿Es esta una señal de que me estoy acercando al problema completamente equivocado? Me pone nervioso no tener ningún código tangible escrito en mi IDE.

Kim Jong Woo
fuente
99
Depende en gran medida del problema y su proceso de pensamiento individual. Si cumple con sus plazos, no importa cuánto tiempo haya pasado pensando y cuánta codificación.
Yannis
44
¿Intentaste dibujar tus componentes en una pizarra? A veces, cuando me enfrento a un dilema de diseño o un algoritmo complejo, empiezo a dibujar. Si está atrapado, entonces tal vez esté tratando de digerir demasiado en su mente. Intente dividir las cosas en componentes pequeños y fácilmente digeribles, luego dibuje cómo interactúan estas diferentes piezas. No necesito estándares formales, de alguna manera hago un UML de Poor Man cuando estoy en la pizarra.
maple_shaft
2
más bien piense en el diseño durante días que implemente un mal diseño rápidamente
Chani
44
¡Sí lo es! Y a veces miro el código que ya he escrito y desearía haber pensado más en el diseño antes de escribirlo: -)
Giorgio
2
La ciencia de la computación, irónicamente, a menudo es independiente de las computadoras
Ryan Kinal

Respuestas:

60

Dependiendo del problema que intente resolver, la fase de diseño puede llevar semanas y meses (si no años), no solo días.

Se necesita experiencia para no comenzar a descifrar el código inmediatamente. Pensar en la arquitectura y el diseño de alto nivel debería llevar días, si no más, definitivamente algo que debería suceder antes de comenzar a escribir su código.

Oded
fuente
1
+1 por años. Estaba involucrado con un grupo donde en la habitación contigua había un equipo que había estado involucrado en la recolección de requisitos para un nuevo sistema durante 5 años, sin un final a la vista. Dudamos seriamente si alguna vez llegarían más lejos.
Jwenting
8
@jwenting ... eso tampoco es bueno, esos tipos tal vez deberían haber comenzado a escribir.
Grady Player
8
@jwenting, sí, eso se llama el método de cascada, y cada uno de ellos debería ser despedido. Si no puede darse cuenta de lo que está tratando de hacer en un año, nunca podrá llevarlo al mercado antes de que la tecnología se vuelva obsoleta.
Riwalk
1
Temo lo que habría pasado si hubieran comenzado a producir código, todos eran analistas de negocios sin ningún tipo de conocimiento técnico :)
comenzó el
24

Esto se conoce comúnmente como "parálisis de análisis"

Es común pero está mal. En algún momento, debe probar las diversas ideas para ver cuál funcionará mejor para usted y luego mejorarlo gradualmente.

Lectura recomendada del programador pragmático Específicamente el Capítulo 2 la sección sobre "Tracer Bullets"

imbéciles
fuente
12
te equivocas al suponer que es necesariamente incorrecto pasar tiempo diseñando tu sistema. Para algo trivial, los días pueden parecer mucho tiempo, para sistemas grandes que abarcarán decenas de miles o cientos de miles de líneas de código, es un tiempo demasiado corto para incluso obtener la arquitectura básica en papel.
Jwenting
3
El tiempo dedicado a pensar es directamente relacionado con la complejidad del problema. Pero si él está "nervioso de no escribir ningún código tangible en mi IDE, lo haré", creo que es seguro asumir que necesita comenzar.
Morons
77
NO HABLÉ DE NINGÚN MODO que es "incorrecto pasar tiempo diseñando su sistema"
Morons
44
@Morons: no importa lo que digas, lo que importa es lo que la gente escucha, y la gente te escucha decir que lo que está haciendo el OP está mal.
cuál es el
55
El término "parálisis de análisis" implica que se está gastando un exceso de tiempo en analizar una decisión. De hecho, es un problema real, pero no está nada claro en la publicación original si ese es el caso en la situación actual. Si pasa unos días pensando en cómo escribir una función para invertir una cadena, eso es parálisis de análisis. Si pasa unos días pensando en cómo escribir un nuevo compilador de c ++ antes de comenzar, eso es lo mínimo que puede hacer.
PeterAllenWebb
10

Esto es completamente común. Sin embargo, si adopta un enfoque de "Prueba primero" o TDD, es menos común y podría ayudarlo a formular mejor sus ideas.

Mover
fuente
5

Los hábitos generalmente son el resultado de enfoques de prueba y error de las cosas y de continuar lo que nos da los resultados deseados y evitar lo que no. Hacer lo que nos gusta y evitar lo que no nos gusta también entra en juego. Eso funciona hasta cierto punto porque eventualmente haremos algo que no nos gusta para que se pague el alquiler.

Depende de lo que te lleve a esto y tus razones. Aquí hay algunos:

  • Con demasiada frecuencia, ha tenido que cambiar el código debido a cambios en el diseño.
  • No cambia un diseño deficiente porque la solución menor ya estaba codificada
  • Prefieres dibujar y diseñar que escribir procrastinación de código
  • tener que preocuparse por la sintaxis y los detalles de la codificación lo distrae de pensar en mejores diseños.

Con suerte, ha descubierto que si diseña más tiempo, su código es mejor. Si puede mirar hacia atrás y ver que no importa cuánto tiempo dedique al diseño, puede cambiar. Otra consideración es la frecuencia con la que descubre problemas después de haber escrito el código en comparación con el trabajo con sus diseños. Si no encuentra problemas hasta después de escribir un código, debe considerar un equilibrio y comenzar a codificar algo más temprano que tarde. Tal vez este enfoque podría aplicarse al uso de nuevas tecnologías o una característica muy compleja.

No sé si tengo la disciplina para mantener un enfoque u otro, incluso cuando descubro que uno funciona mejor que el otro. A veces siento la necesidad de ir a la pizarra; otros el teclado.

JeffO
fuente
4

Es muy común y siento que es una mejor manera de manejar y comprender las cosas. Mientras trabajo en un proyecto, me atasco muchas veces y me toma un día o dos entender cómo puedo abordarlo mejor. Incluso después de que se resuelva el problema, espero que pase un día. Esto me refresca y me pone en marcha.

Es un fenómeno natural y bueno para un desarrollador interceptar su tiempo mental y entre ellos.

Pankaj Upadhyay
fuente
4

Cuando tomé un curso de gestión de proyectos, una de las cosas que el instructor nos relató sobre planificación, que se me quedó grabado en la cabeza, fue que la regla general que enseñaban en el ejército era calcular 1/3 del tiempo para planificar . Entonces, si tuvo una operación que requirió completar 3 meses a partir de ahora, piense en gastar un mes en la planificación antes de comenzar la ejecución.

Scott Whitlock
fuente
4

En mi opinión, hay tres enfoques, cada uno adecuado para una situación de codificación específica

  1. He visto un problema similar antes, así que tengo una idea bastante buena de los patrones a aplicar, y está claro cómo debe comportarse y responder la solución.

    => Utilice BDD / TDD a partir de las soluciones deseadas y trabajando en el código. (Ok, a veces hago trampa y escribo un poco de código y luego la prueba, una especie de enfoque anidado 2. -> 1.).

  2. Tengo una buena idea de los patrones para aplicar, pero no estoy seguro de cómo debería ser la solución.

    => Prototipo para ver qué tipo de cosas interesantes aparecen. Pase a 1. cuando descubra qué cosas interesantes se desean.

  3. No estoy seguro de qué patrones aplicar.

    => Piensa en el problema y cómo las diversas formas de abordar el problema influyen en el código. Pase a 2) o 1) según el resultado de ese ejercicio.

En otras palabras, la respuesta es la favorita del ingeniero: depende.

forforf
fuente
3

Es mejor pasar un mes pensando y diseñando que preparar un prototipo rápido basado en un diseño deficiente que luego se debe poner en forma. Especialmente si estás en un equipo; Una vez que otros comienzan a depender de su código, es mucho más difícil implementar un mejor diseño con una API diferente.

TMN
fuente
2

Estoy de acuerdo con las otras respuestas que, en principio, tomarse el tiempo para pensar un problema / solución es una buena idea. Sin embargo, si siente que está atascado, tengo algunas recomendaciones sobre cómo hacer que el proceso de planificación sea un poco más coherente:

  • Crea artefactos de diseño. ¿Y qué si no escribes código? Tal vez solo escriba un diario de sus pensamientos. O un boceto de una solución general. O incluso un resumen realmente bueno del problema que refina con el tiempo. Al considerar las ideas y aceptarlas / rechazarlas, mantenga un registro de su razonamiento sobre el tema. De esta manera, al final del día, aún puede señalar los entregables del mundo real como evidencia de su trabajo.

  • ¡Hablar con las personas! No hay nada como tener un ser humano vivo y con quien discutir ideas. Si crees que estás atrapado, háblalo con alguien. Agarra a alguien, ¡a cualquiera! Y explícales el problema. Esboza tus pensamientos sobre cómo resolver el problema. Incluso si todo lo que hacen es inhalar, exhalar y parpadear durante diez minutos mientras balbuceas, lo más probable es que descubras una nueva visión solo en el proceso de explicar el problema .

Stephen Gross
fuente
1

Como dijo Satchel Paige: "A veces me siento y pienso, y a veces me siento".

Supongo que a lo que se refería es que a veces es bueno despejar la mente, ya que puede llevarlo a pensar en su problema de una manera diferente. Por lo tanto, si no está golpeando el código, puede encontrar una solución o idea que podría haberlo evadido de otra manera. Entonces, sí, es normal y una buena práctica no saltar directamente a la codificación.

Hay dos formas en que hago este proceso yo mismo. Creo una carpeta donde tengo un archivo de texto y cualquier dibujo relacionado con el proyecto. Anoto mis ideas allí y trato de guardar todo el proceso de pensamiento lo mejor que puedo. También crearé un proyecto de scratchpad donde pueda probar rápidamente ideas simples desde algoritmos hasta diseños CSS.

jfrankcarr
fuente
1

Programa = Algoritmo + Estructura de datos

En mi humilde opinión, el proceso de diseño (resolución de problemas) gobierna totalmente. Los detalles de implementación (problema técnico) siguen y resuelven naturalmente.

Terry Li
fuente
Realmente me gusta esa ecuación simplificada. +1
Kim Jong Woo
1

Aquí está mi caso de pensamiento.

  1. Comenzando desde cero Primero se requiere una idea aproximada de lo que desea. Intente obtener una lista de algunos requisitos o créelos. Debería llevar un poco de tiempo resolver las cosas aquí. Una vez que tenga al menos una pieza que está seguro de que desea, conozca la mayor parte de la interfaz de esa pieza, luego comience a codificar.

  2. Solución de un problema con el código existente En primer lugar, realice un seguimiento del problema. Esto puede requerir un tiempo de no escribir código real (es posible que se escriba algún código de depuración, pero esto generalmente no se guardará). Una vez que encuentre el problema, dependiendo de la complejidad, comience a escribir código para intentar solucionarlo. Se debe pensar poco una vez que se conoce el error. Si el problema resulta ser un gran defecto de diseño, consulte la siguiente sección.

  3. Cambios de diseño / características principales Esta es probablemente la que requerirá más atención. Se debe incluir la idea de preservar la estructura, la compatibilidad con versiones anteriores, etc. Pensar en el mejor cambio podría ahorrarme un tiempo significativo, pero generalmente para mí no es más que unos pocos días.

  4. Agregar una función simple Si no se requiere un cambio significativo en el diseño, simplemente codifique su función, utilizando alguna prueba / error. Esto no debería requerir mucho tiempo en general.

PearsonArtPhoto
fuente
0

No voy a estar de acuerdo con el consenso sobre este. Prefiero comenzar a crear prototipos de algo tan pronto como tenga la más vaga idea escrita de una servilleta de cómo quiero que funcione mi sistema. Es casi imposible para mí pensar en todos los pequeños detalles que pueden causar problemas a menos que esté especificando las cosas de una manera muy precisa. Si solo estoy discutiendo el diseño con la gente, es demasiado fácil simplemente agitar algunos de los problemas más complejos. Una vez que especifique cosas como esta, también puede estar directamente en el código fuente en lugar de algún otro medio de expresión que sea igual de preciso y formal, pero que no se pueda compilar y ejecutar.

dsimcha
fuente
3
Hay una diferencia entre descifrar los detalles y descifrar los conceptos básicos. Por ejemplo, si tuviera que diseñar un idioma, desearía decidir si su idioma era procesal o funcional antes de acercarse a un teclado. Nadie dice que tiene que averiguar los detalles cuando planifica, pero necesita saber a dónde va.
riwalk
@ Stargazer712: estoy completamente de acuerdo. Es por eso que dije que necesitas al menos una idea de servilleta qué diablos vas a hacer. Sin embargo, por la forma en que se hizo esta pregunta, me imaginaba días o semanas de reuniones formales y burocráticas, incluso antes de intentar sacar un prototipo de las características más arriesgadas / novedosas / interesantes.
dsimcha
0

Depende de qué quieres decir con "normal" . Hablando de mí, creo que el código es una gran herramienta de aprendizaje. Entonces, cuando enfrento un problema complejo, hago bocetos en papel pero también hago algo de codificación basada en pruebas. Code me dice que piensa que una pizarra no puede decir y viceversa, y tal vez el resultado sea una idea o la necesidad de un par de preguntas más para el experto en el dominio.

Entonces, el verdadero consejo es: "Use todas las herramientas de aprendizaje necesarias para acercarse a la definición del problema" , pero también "recuerde que estas son herramientas de aprendizaje, así que no se enamore de ellas", tanto el código como los bocetos están destinados a ser desechables .

ZioBrando
fuente
0

En esta era de RAD y programación ágil, debe comenzar a desarrollar tan pronto como pueda identificar las partes principales del sistema, aparecerán detalles. Como los softwares son cada vez más grandes, enfocarse prematuramente en cada detalle no lo llevará a ninguna parte.

Syed Aqeel Ashiq
fuente
2
Y no enfocarse en suficientes detalles puede llevarlo a un lugar donde ningún lugar es un lugar mucho mejor para estar.
Dunk
@Dunk Usé tres palabras: prematuramente, cada una, sobre enfocarme en los detalles. No le dije que golpeara el teclado de inmediato, consiga al hombre a la deriva.
Syed Aqeel Ashiq