¿Cómo dar un paso atrás y mirar el código con ojos nuevos? [cerrado]

53

Pasé el último año como un equipo de un solo hombre desarrollando una aplicación de cliente rico (más de 35,000 LoC, por lo que vale). Actualmente es estable y en producción. Sin embargo, sé que mis habilidades estaban oxidadas al comienzo del proyecto, por lo que sin duda hay problemas importantes en el código. En este punto, la mayoría de los problemas están relacionados con la arquitectura, la estructura y las interacciones: los problemas fáciles, incluso los problemas de arquitectura / diseño, ya han sido eliminados.

Desafortunadamente, pasé tanto tiempo con este proyecto que me resulta difícil pensar fuera de él: abordarlo desde una nueva perspectiva para ver los defectos profundamente enterrados o inherentes al diseño.

¿Cómo salgo de mi cabeza y de mi código para obtener una nueva apariencia y mejorarlo?

BenCole
fuente
15
En el futuro, por favor no cruce . Si cometió un error al publicar en el sitio StackExchange incorrecto, marque la migración y explique dónde cree que pertenece y un moderador migrará la pregunta por usted.
maple_shaft
¡OK lo haré! :) Un par de personas habían marcado para cerrar, no para moverse, así que borré toda la pregunta y la traje aquí.
BenCole
¡Sip! - la gente había hecho clic en el botón "cerrar", no en el botón "bandera" (al menos, creo que eso fue lo que sucedió). De ahora en adelante, lo marcaré yo mismo y esperaré la migración.
BenCole
OMI, si no puedes encontrar formas de mejorar las cosas, entonces no sabes lo suficiente. He creado algunos diseños realmente impresionantes en el pasado, pero cuando vuelvo a ello un poco más tarde, siempre me pregunto por qué haría algo tan estúpidamente. De todos modos, puede adoptar el enfoque de que su diseño está bien. Luego, cuando agregue funciones, si fue difícil, descubra cómo podría haberlo facilitado.
Dunk

Respuestas:

46

Formas de abordar esto:

  • Encuentre a alguien familiarizado con la tecnología y el problema comercial y háblelo. Esto puede ser difícil en un equipo de una sola persona, pero generalmente es la mejor opción.
  • Trabaja en un proyecto diferente por un tiempo. Esto también puede ser difícil, pero incluso tomarse un descanso de una semana puede darle una nueva perspectiva.
  • Mire proyectos o productos similares, como productos de código abierto, si existen. Tenga cuidado de no copiar el código, pero pueden haber abordado la idea de manera completamente diferente.
  • Aprenda un nuevo idioma, biblioteca o marco. Las técnicas involucradas pueden darle una idea de cómo abordar los mismos problemas que tiene de manera diferente.
  • Lea un buen libro / blog / revista sobre diseño o el lenguaje / marco. No estoy seguro de en qué nivel de habilidad se encuentra, pero hay muchas alternativas en otras respuestas en este sitio.

Si tiene ejemplos específicos que desea abordar, quizás publíquelos aquí.

akton
fuente
66
+1 aprende un nuevo lenguaje / marco. Si está trabajando en un lenguaje de script, aprenda uno orientado a objetos. Si OO, aprende uno funcional (lisp-ish). Lectura +1: especialmente estructuras de datos, patrones de diseño, refactorización y mejores prácticas. Lea los libros de Joel on Software si aún no lo ha hecho. También recomendaría grupos de usuarios y este sitio para seguir exponiéndolo a nuevas ideas. Si el ACM da charlas en su área, ¡únase y asista!
GlenPeterson
2
Más específicamente a los idiomas, si aún no lo ha aprendido, aprenda Haskell, pensé que todos estaban exagerando y siendo fanáticos de cómo cambiará fundamentalmente la forma en que aborda los problemas de programación. Como buen científico puse a prueba mi hipótesis al aprenderla, estaba tan equivocado. Usted va a acercarse a su diseño actual de manera diferente después si aún no lo ha aprendido Haskell.
Jimmy Hoffa
1
Ir a la conferencia debe agregarse aquí, OMI. Se mi respuesta elaborada a continuación.
Macke
+1 para diferentes proyectos. Pruebe algo completamente fuera del alcance de lo que hace día a día. Encontrarás algunos paralelos y un nuevo desafío arquitectónico.
Clemencia
13

Depuración de pato de goma : siéntese con un código o un módulo o una función y explíquelo en voz alta. Cuando te encuentres diciendo algo que suena mal, tonto o simplemente no correcto, escríbelo como un tema a investigar.

Freiheit
fuente
9

Sigue aprendiendo y ampliando tus habilidades. Es difícil saber lo que no sabes, pero cuando lo ves, ese momento "ajá" te golpeará. Podría provenir de aprender otro idioma o patrón de diseño.

Te pedirán que hagas un cambio. Es posible que encuentre partes de su código que no son tan flexibles y requerirán mucho trabajo. Esto no es necesariamente un fracaso porque no puedes pensar en todo al principio.

Los usuarios comenzarán a quejarse. Justo cuando crees que todo es genial ...

JeffO
fuente
7

Un breve recuerdo ayuda. Se me conoce por quejarme del "idiota" que cambió algo hace una semana, solo para descubrir por el control de la fuente que era yo.

Un buen primer paso es identificar el código que podría mejorarse. Busque en su control de origen los archivos que cambian con más frecuencia. ¿Con qué código es más difícil trabajar? ¿Qué código produce más errores? ¿Qué tipo de cambios causan un efecto dominó en todo el código? En esta etapa, no tiene que saber por qué el código es problemático, solo que es problemático.

Una vez que haya identificado las áreas para trabajar, intente averiguar cuál es realmente el problema. Hay libros que adoptan un enfoque sistemático para clasificar los problemas de diseño. Mire la refactorización de Martin Fowler , los estándares de codificación C ++ de Herb Sutter , el código limpio de Robert Martin , etc. Tienen un montón de "reglas" que le permiten ver su código de manera objetiva.

Una vez que haya identificado cuál es el problema probable, pruebe diferentes formas de solucionarlo. Por ejemplo, si la regla que rompió es "prefiera la composición sobre la herencia", cámbiela a composición y vea cómo se siente.

Obviamente, puede ser útil que alguien más vea el código, pero no siempre es tan útil como podría pensar, porque está mucho más familiarizado con los tipos de problemas que el código que cualquier otra persona, y las razones detrás del diseño . Aprender algunas formas de evaluar objetivamente su propio diseño pagará grandes dividendos.

Karl Bielefeldt
fuente
3
+10 por la honestidad del comentario "idiota". :)
Jennifer S
2
En relación con el enfoque basado en "reglas", la ejecución de herramientas de análisis estático (por ejemplo, lint para C, JsLint para JavaScript, Findbugs para Java, FxCop para .NET) a menudo puede dar pistas útiles, y las métricas de código (por ejemplo, complejidad ciclomática, LCOM4) pueden mostrar Usted qué partes del código pueden ser problemáticas. Por supuesto, siempre debe usar su cerebro y seguir el consejo de tales herramientas con un grano de sal.
Daniel Pryden
4

Haga que otra persona mire su código. Si no puede encontrar a otra persona para verlo, escriba una descripción completa de la interacción como si se la mostrara a otra persona. El proceso de tratar de explicar sus decisiones a otra persona (incluso si es solo por práctica) puede ayudarlo a pensar realmente POR QUÉ está haciendo las cosas de cierta manera y ayudarlo a ver cualquier agujero en su lógica.

Ben McCormick
fuente
3
Me parece útil explicarle cosas incluso a una persona no técnica. Si puedo hacer que un no programador entienda el diseño y explique satisfactoriamente por qué uno podría necesitar una fábrica de fábrica de ventanas, entonces tal vez sería bueno usar una fábrica de fábrica de ventanas.
Leif Carlsen
4

Conozco muy bien esta situación. Cuando me atasco de esa manera, trato de tomar diferentes puntos de vista sobre el proyecto.

1.) Punto de vista del usuario / cliente - use comentarios

Desafortunadamente, estamos atrapados en nuestro código de una manera que no podemos ver nuestros propios defectos porque usamos nuestras aplicaciones de la forma en que las codificamos. Mire cómo la gente lo usa e intente descubrir cuál sería la guía de usuario más intuitiva. Juega con prototipos de UI. Esto parece ser divertido, pero si descubre que se vería obligado a recodificar grandes partes de su código simplemente cambiando la lógica de uso que es hora de comenzar un ciclo de rediseño.

2.) Haz un análisis funcional de tu código y visualízalo

Algunos IDE y frameworks lo empujan a, por ejemplo, mezclar UI y código de back-end. Si permite que esto suceda, algún día enfrentará la situación de que su base de código difícilmente puede mantenerse debido a dependencias nebulosas y difíciles de romper. Especialmente mezclar el código de la interfaz de usuario con otro código puede generar código de espagueti y funcionalidad redundante. Divida su código en bloques funcionales como, por ejemplo, clases de bases de datos, clases de comunicación, clases de interfaz de usuario, clases principales, etc. y dé a los bloques de funciones nombres para hablar. Luego visualice la funcionalidad con una herramienta gráfica (uso una herramienta de mapeo mental) para averiguar si su estructura es lo suficientemente lógica y modular como para que pueda reutilizar enormes bloques de código para diferentes proyectos y pueda reemplazarlos con versiones más nuevas sin dolor grande.

La mejor manera de hacer esto en mi experiencia es crear un documento que visualice todas las dependencias entre sus clases y sus llamadas desde su código. El resultado es una visualización del diseño de su interfaz. Si este mapa de códigos parece un clusterf completo ***, es hora de actuar. Si aún no sucedió, debe pensar en una convención de nomenclatura adecuada que represente la estructura de su código de una manera que no tenga que pensar en cómo llamarlo y qué hace.

3.) Utilice enfoques comunes para garantizar la calidad

Mi favorito es el FMEA. En términos de codificación, esto significa no solo analizar lo que salió mal en el pasado sino también pensar en lo que podría salir mal. Un ejemplo bastante común es una conexión de red repentinamente caída. Después de hacer esto, puede clasificar las condiciones de error por consecuencias como pérdida de datos, bloqueo, cálculo incorrecto y juzgar el impacto en el usuario. Si aún no lo ha hecho, la definición de errores simplificados y las clases y rutinas de excepciones pueden ayudarlo a mantener su código limpio y directo. La mejor manera es implementarlos en cada nuevo código antes de comenzar a escribir cualquier otra cosa. (Bueno, no siempre soy culpable de seguir este consejo).

Además, me ayudó a generar y actualizar con frecuencia una "lista de propuestas de mejora" para mi propio código. (Para ser sincero, todavía hay mucho código en mis proyectos de los que definitivamente no estoy orgulloso). También trato de tomarme el tiempo para recopilar y echar un vistazo al código de mejores prácticas de las documentaciones API, conferencias de desarrolladores o revistas de desarrolladores.

Hasta este punto no hay necesidad de tocar su código. Se trata simplemente de darse cuenta de lo que va mal y encontrar una manera de definir cómo mejorar su código.

Finalmente algunos consejos para el trabajo diario de un viejo pedo. Intenta evitar morder más de lo que puedes comer. Esto lleva a demasiada presión para una codificación limpia. Raramente tienes tiempo para hacerlo bien, pero luego tendrás que tomarte el tiempo para arreglar los defectos.

Nada es tan duradero como la solución provisional, pero cuando se rompe a menudo es demasiado tarde para solucionarlo a tiempo. Los ejemplos son hacks desagradables o excepciones extrañas que solía hacer que algo funcionara a pesar de, por ejemplo, una falla en el marco subyacente o el sistema operativo. Y luego la falla se soluciona o la nueva versión simplemente elimina la API ...

Si está atascado y se ve obligado a encontrar una solución alternativa que hacer comentarios y tomar notas que deben revisarse de vez en cuando. Normalmente mejoramos cada vez más por aprender algo nuevo. Si encuentra una mejor manera, impleméntelo tan rápido como pueda. De lo contrario, podría encontrarse codificando la solución para la solución y la excepción de la excepción algún día. (El que no tiene pecado entre ustedes, que me arroje el primer byte).

sacristán
fuente
2

No te preocupes por las cosas pequeñas.

Todos podrían codificar mejor. Hacemos las cosas rápido y luego nos damos cuenta un par de semanas después de que podría haberse hecho de manera más eficiente. El punto es que el 90% de su código es probablemente lo suficientemente bueno.

Revise sus registros de errores y encuentre las rutinas que podrían estar causando problemas. A medida que encuentre los errores, también puede revisar el código y pensar en lo que podría hacer que el código sea más eficiente. La mayoría de las veces, se dará cuenta de que más allá de corregir el error en sí mismo, no podrá realizar una mejora notable, pero a veces, se dará cuenta de que hay una mejor manera de hacer algo.

Hable con los usuarios y vea dónde notan problemas, ya sea UX o problemas de velocidad. Solucione estos problemas, con la intención de mejorar su código.

En algún momento, descubrirá que su código se ha vuelto demasiado frágil y que simplemente no hay forma de hacer los cambios que necesita hacer. Luego, piense en cómo podría haber hecho que el sistema sea más flexible, ya sea a través de API o desarrollo impulsado por pruebas. En muchos casos, descubrirá que puede comenzar a poner estas API en el código, sin una gran cantidad de cambios. En otros casos, te darás cuenta de que el esfuerzo de mejorar el código no vale la pena.

Los cambios incrementales pueden ser difíciles. El objetivo es no volver a escribir completamente la base del código si no es necesario. Claro, ahora eres un mejor programador que hace un año, pero lo que tienes debe estar funcionando ahora. 5 años a partir de ahora, cuando un programador junior se queje sobre el código heredado que tiene que intentar arreglar, solo sonríe y asiente, y no admitas que lo escribiste.

Brian Hoover
fuente
1

¿Has considerado irte y buscar una empresa en la que puedas formar parte de un equipo? Creo firmemente que, aislado o en un equipo estancado, los desarrolladores se pierden mucho de lo que la profesión tiene para ofrecer.

Las revisiones por pares permiten que alguien que ya está fuera de tu cabeza te dé tu consejo. La Revisión de código de intercambio de pila puede ser un buen lugar para poner a revisión algún código que no sea particularmente propiedad de su empresa. Probablemente no pueda manejar grandes bloques, pero muchos programas están hechos de una gran cantidad de código simple y algún otro código que no es simple y crea muchos problemas. Si tiene un ejemplo de algún código que es típico, pero se repite y altera muchos lugares, también podría ser un buen candidato para la revisión. Por ejemplo, si formatea mensajes, no pida que se revisen todos los mensajes que pasan, solo un mensaje de ejemplo bastante complejo.

Si desea ser más objetivo sobre su propio código, supongo que podría compararlo con un estándar de codificación, ejecutar verificadores de código estático o dinámico, o si está escasamente documentado, agregar comentarios podría ayudar.

Existe una psicología de las pruebas que hace que sea difícil probar su propio código, pero ciertamente hacemos todo lo posible durante la prueba de la unidad. Leer su propio código puede ser un problema similar o peor. Muchos campos utilizan mentores, juicios competitivos, entrenadores, etc. El nuestro también lo hace si cuenta arquitectos, ingenieros de sistemas y evaluadores. Los clientes con acceso a una herramienta de informe de errores o al departamento de atención al cliente le darán comentarios desde fuera de su cabeza una vez que se envíe el producto. Esta es otra gran razón para el enfoque de Agile de lanzar temprano y con frecuencia. Es posible que sea el único desarrollador de su empresa, pero hay personas afectadas por su código que pueden brindarle comentarios al respecto desde algún ángulo.

DesarrolladorDon
fuente
0

"¿Es este un problema menor de lo que creo que es, o también es un problema experimentado por otros?"

Sheesh Basta ya. Si el código está en producción, libre de errores y haciendo lo que se supone que debe hacer, la arquitectura no es importante. Por ahora.

Todos esperamos aprender a medida que avanzamos. Escribí mucho código del que estaba orgulloso en el momento en que lo escribí, solo para decidir que fue horrible uno o dos años después. En este momento estoy trabajando en un proyecto de varios años que está lleno de código increíblemente descuidado, pero el código funciona. Estoy adoptando un enfoque muy conservador para tocarlo.

Y tú también deberías. Si no ve ningún problema arquitectónico importante en este momento, después de un año de trabajo, creo que puede ser seguro para usted asumir, por ahora, que no hay problemas importantes. Esto no es mala artesanía. Está avanzando

user75772
fuente
0

Además de otras respuestas, recomendaría ir a una conferencia de desarrolladores.

Esto lo expondrá a muchos temas y personas que lo harán pensar en su propia aplicación y lugar de trabajo. Especialmente porque hablarán sobre lo que funciona y no para entonces, y los problemas que surjan. Existe una gran probabilidad de que haya alguna superposición con su aplicación.

Preferiblemente, tome 3 días para esto. He descubierto que es lo suficientemente largo como para obtener la distancia mental necesaria para mi propio trabajo y mirarlo a través de los ojos de una comunidad más grande (por así decirlo), en lugar de la mía.

Por cierto, esto también se aplica a equipos de personas, ya que el pensamiento grupal puede ocurrir en cualquier lugar.

Finalmente, si no obtiene aprobación para esto, diga una vez al año, cambie de trabajo.

Macke
fuente
-1
  • Practique patrones de diseño y mejores prácticas
  • Elija un marco, herramientas, paquetes, etc. en función de los requisitos y necesidades de su aplicación; para esto, necesita leer muchos blogs de grabado y encontrar soluciones para cada problema tecnológico individual
  • Cree un borrador de diseño / arquitectura y discuta con alguien que sea bueno en cosas técnicas / arquitectónicas. Mejore este borrador utilizando comentarios y comentarios. sigue haciendo esto hasta que alcances un estado estable.
  • Implemente código de manera que todo lo que la aplicación necesite sea configurable y mantenible

    rediseñar y reimplementar su proyecto definitivamente dará como resultado que la aplicación tenga una mejor consistencia, rendimiento, etc.

Murali Mopuru
fuente
-1

Creo que 'patear' las preocupaciones con algunas personas inteligentes ayuda. Debe haber información específica. ¿Es un sitio web 24x7x365? Aplicación LoB? ¿Dónde se está ejecutando o alojado?

Una vez que entras en los objetivos centrales y los resultados deseados, otros pueden ayudarte a enfocarte y dirigir tu atención. Su código podría ser el mejor código jamás escrito para una tarea específica, o el peor. Realmente no importa: ¿cómo afecta eso al objetivo deseado?

user75800
fuente