¿Cómo se mantiene productivo cuando se trata de código extremadamente mal escrito?

63

No tengo mucha experiencia en trabajar en la industria del software, ser autodidacta y haber participado en código abierto antes de decidir tomar un trabajo. Ahora que trabajo por dinero, también tengo que lidiar con algunas cosas desagradables, lo cual es normal, por supuesto.

Recientemente me asignaron agregar el registro a un gran proyecto de SharePoint que fue escrito por un programador que obviamente estaba aprendiendo a codificar en el trabajo. Después de 2 años de colaboración, el cliente cambió a nuestra empresa, pero el daño ya estaba hecho y ahora de alguna manera necesito mantener este código.

No es que el código fuera demasiado difícil de leer. A pesar de los problemas, cada proyecto tiene una clase con varios métodos pegados, enormes ifanidamientos, sistemas húngaros, conexiones no expuestas, todavía es legible.

Sin embargo, me encontré absolutamente improductivo a pesar de trabajar en algo tan simple como agregar registros. Básicamente, solo necesito revisar el código paso a paso y agregar algunas llamadas de rastreo. Sin embargo, la idiotez del código es tan molesta que me canso a los 10 minutos de comenzar . Al principio, solía agregar usingconstrucciones, reducir el anidamiento invirtiendo if, cambiar el nombre de las variables a nombres legibles, pero el proyecto es grande y finalmente me di por vencido. Sé que esta no es la tarea que debería estar haciendo, pero al menos reducir el desorden me dio algún tipo de recompensa psicológica para poder seguir adelante. Ahora el truco dejó de funcionar y todavía tengo el 60% de mi trabajo por hacer.

Comencé a tener dolores de cabeza después del trabajo, y ya no tengo la sensación de satisfacción que solía tener, lo que generalmente me permitía codificar durante 10 horas seguidas y aún sentirme fresco.

Esta no es solo una gran queja, porque realmente tengo una pregunta real:

¿Hay alguna manera de mantenerse productivo y no luchar contra los molinos de viento?

¿Hay algún tipo de truco psicológico para mantenerse enfocado en la tarea, en lugar de pensar “¿Qué tan estúpido es eso ?” Cada vez que veo otro ingenioso truco del programador anterior? El problema al agregar el registro es que realmente tengo que entender lo que hace el código, y hacerlo lastima mi cerebro de una manera desagradable.

Dan
fuente
La notación húngara no es mala, lea el periódico original para ver de qué estaba hablando :)
Woot4Moo
14
Sé que húngaro no es malo. Esta es precisamente la razón por la que escribí Systems Hungarian, no Apps Hungarian (el original). No tengo sentido usar Systems Hungarian en C # porque tiene un gran sistema de tipos e IDE. Tener 10 variables en el mismo alcance con el que todos comienzan objes desalentador porque es básicamente ilegible.
Dan
2
¡Ojalá pudiera dar esta pregunta más de un voto!
o6tech
99
Me desahogo haciendo preguntas de mal humor en la pila que me desmotivan.
Erik Reppen

Respuestas:

32

Lamento decírtelo, pero no todos los trabajos están llenos de sol y glamour. La mayoría de las tareas de desarrollo implican trabajos de trabajo como este. Triste pero cierto.

Tiene la tarea de un trabajo importante, incluso si es aburrido hasta el punto de ver la pintura seca. Es importante por dos razones: 1. Agrega un registro muy necesario a un sistema grande para que cuando algo salga mal, tenga una herramienta que lo ayude a encontrarlo. y 2. Te familiariza con la base del código para que, si algo sale mal, puedas saltar y arreglarlo.

Básicamente, está creando su propia red de seguridad aquí. Glamour, no, pero importante sí!

Entonces, dicho esto, ¿cómo deberías motivarte? Cuando tengo una tarea de adormecimiento mental en el trabajo, me propongo objetivos. Termina de hacer la tarea x al final de la semana. Si hago mi meta, me recompensaré. ¿Nuevo restaurante que quiero probar? Ve el viernes por la noche si termino. Nueva película acaba de salir? Véalo el fin de semana si termino.

Encuentro que hablar con mi supervisor y hacerle saber dónde estoy y cómo estoy progresando me hace responsable. Si les digo que terminaré antes del viernes, me siento más inclinado a hacerlo antes del viernes b / c. Les dije que lo haría.

Tenga fe en que una vez que complete esta tarea y lo haya hecho bien, a tiempo y dentro del presupuesto, la gente lo notará y cuando aparezca ese nuevo proyecto brillante, su nombre podría ser sugerido como el que lo recibe. :)

Tyanna
fuente
Me gusta especialmente el punto sobre la motivación del viernes. Es curioso que el lanzamiento actual también esté programado para el viernes. Creo que vale la pena agregar que la motivación de gratitud es conmovedora. Debes asegurarte de que alguien esté agradecido por tu trabajo, o de lo contrario cambiar en lo que estás trabajando. El sincero 'gracias' a menudo hace retroceder las horas inquietas.
Dan
1
@gaearon: me alegra que las sugerencias sean útiles para usted. Superar el trabajo de trabajo con un buen nivel de motivación valdrá la pena al final. El año pasado en mi trabajo actual, tuve que hacer algo similar a lo que estás haciendo. Este año me dieron una nueva aplicación para escribir desde cero. La gente notará lo que haces y qué tan bien trabajas.
Tyanna
3
-1 ¿Por qué vincular tu vida laboral y tu vida personal? Esto suena similar a quedarse horas extras constantementeI didn't finish my under-estimated task by Friday - so I need to stay at home and feel bad.
Vorac
@Vorac ~ Dije que eso es lo que hago para motivarme. Todos son diferentes. Y les puedo asegurar que no trabajo OT constantemente. Encuentra algo que te motive y úsalo. Creo que una recompensa material funciona mejor cuando tengo una tarea que no quiero hacer.
Tyanna
1
@IntegrityFirst ~ Para mí, sí. Me quedaré tarde para terminar mi lista de tareas. Voy a presupuestar mi tiempo para asegurarme de golpearlo. Es mi integridad para mí y para mis compañeros de trabajo completar algo cuando digo que lo completaré. Pero, si descubro que no se puede hacer algo en el tiempo que he dicho, cambio el plan y se lo hago saber a mi supervisor. Y si termino un poco tarde, la película / restaurante estará allí la próxima semana. :)
Tyanna
30

Mantenga un archivo de fragmentos de código candidato para enviar a thedailywtf.com. Incluso si realmente no tiene la intención de enviarlos, le da un lado positivo para encontrar algún código que sea aún peor que el promedio.

Peter Taylor
fuente
Desearía poder votarlo una vez más. Resultó ser una gran sugerencia, ahora que descubrí que estos tipos almacenan sus registros de cambios en los archivos de configuración de la aplicación, justo antes de la configuración real.
Dan
24

Estaba en una situación similar, encargada de limpiar un gran cuerpo de código mal escrito, masivamente copiado y pegado.

Para mantener mi motivación y mi cordura, escribí un script llamado current_scoreque contaba el LOC en el proyecto (que disminuyó constantemente, ya que eliminé la duplicación y cambié a mejores algoritmos) y lo comparé con el LOC cuando comencé. Cada vez que me desanimaba o me frustraba con la montaña de código que enfrentaba, correr current_scoreme daría una sensación de progreso tangible y me recordaría cuánto había logrado. Y fue divertido ver cuán alto puntaje podría acumular al abordar una sección de código particularmente mala.

Buscaría métricas similares que podrías escribir fácilmente para darte una sensación de progreso y convertirlo en un tipo de juego. Líneas de código (simplemente ejecutadas wc -l), complejidad ciclomática (que debería disminuir a medida que limpia esos "si" desagradables anidados), líneas de código que ha tocado usted en lugar de su predecesor (creo que FishEye puede decirle esto para $ 10), etc. Incluso podría escribir un script de Perl sin muchos problemas para contar la cantidad de bloques de código que aún no tienen declaraciones de registro.

Josh Kelley
fuente
Yo uso SourceMonitor
UmNyobe
13

He visto este libro recomendado: trabajar eficazmente con código heredado , pero afortunadamente no he tenido la necesidad de leerlo.

Como lo está haciendo, refactorice lo que necesita para que pueda comprender el código y solo recuerde que está resucitando un sistema, que dará sus frutos cuando lo esté manteniendo.
Con suerte, eso debería poner un resorte en tu paso en el camino a casa.

StuperUser
fuente
2
Este libro trata sobre la refactorización del código existente para que sea comprobable; No creo que vaya a ayudar mucho en el camino de la motivación.
Billy ONeal
2
Buen punto @Billy ONeal, pero tener un código comprobable y las métricas asociadas puede mostrar un progreso que podría ser motivador.
StuperUser
1
He leído este libro Definitivamente vale la pena leerlo. En realidad, encontré WEWLC motivador solo porque era bueno saber que había alguien por ahí que entendía exactamente el tipo de frustraciones que estaba teniendo y había ideado formas efectivas para mitigar esas frustraciones.
Jason Swett
1
Ese libro es un poco viejo y anticuado. Si no lo leyó, ¿por qué lo recomienda?
B 22овић
1
@StuperUser Mientras lo leo, puedo decir que está desactualizado y puedo brindar algunos consejos útiles para usuarios novatos.
B 25овић
6

Intenta dividir el proyecto en trozos. Cada día aprende cómo funciona un fragmento específico. Tratar de entenderlo todo de una vez es probablemente lo que te estresa.

Enorgullecerse de mejorar el proyecto. ¿Hay otros codificadores con los que puedas hablar? Ayuda a pararse alrededor del refrigerador de agua discutiendo / riéndose de la última lógica que encontró. Intento hacer esto para mantener una atmósfera jovial en el trabajo.

davidhaskins
fuente
Sí, estoy trabajando por partes, y ya he estado trabajando en ello durante algún tiempo, así que tengo una idea aproximada sobre cada componente. Aún así, no ayuda mucho porque son las pequeñas piezas de lógica que generalmente toman tiempo para comprender, y me enojo cuando me doy cuenta de que el método de 30 líneas en el que pasé 10 minutos en realidad puede reescribirse en 2 líneas. En cuanto a la compañía, desafortunadamente, soy el único desarrollador en este proyecto, y actualmente estoy trabajando en la oficina del cliente, así que no hay nadie con quien realmente pueda hablar.
Dan
@gaearon: ¿Qué le impide implementar su solución de 2 líneas? Debe descubrir cómo hacer lo que se le asignó, el problema con el código se puede resolver más adelante, cuando no se encuentre en la oficina del cliente. Debe mantener sus notas sobre lo que hizo, cómo funciona algo, para poder regresar más adelante en el futuro e implementar sus cambios para que se puedan realizar revisiones de código y pruebas de integración.
Ramhound
@gaearon ah-ha! Eres el único codificador. Entonces el tipo antes que tú era el único codificador. Puedes salirte con la tuya cuando eres el único codificador (como has notado de tu predecesor). Tenga esto en cuenta cuando busque su próximo trabajo. ;)
davidhaskins
@Ramhound Apuesto a que no habrá revisiones de código. Apuesto a que no habrá pruebas formales de integración. He trabajado en estos puestos varias veces. En general, las personas solo quieren un código que funcione lo suficientemente bien, y lo quieren lo más rápido posible. Explicar las "mejores prácticas" es como hablar con un muro, en mi humilde opinión.
davidhaskins
@Ramhound, no hay pruebas para este proyecto, y no quiero ser responsable de arruinar el sistema en aras de un código más limpio. Hay muchos casos en los que el código actual implica que se tragan excepciones, o se basa en otros tipos de mal comportamiento que no es obvio. Por cierto, esta es una de las razones por las que estoy agregando el registro.
Dan
6

Tome notas extensas para organizar sus preguntas, pensamientos y comprensión del sistema. Esto ha funcionado de maravilla para mí cuando se trata de grandes sistemas heredados. Ayuda a cristalizar su comprensión, ayuda a expresar las preguntas abiertas en palabras, y debido a que sus pensamientos ya están juntos, facilita la comunicación espontánea con otros sobre problemas / preguntas / ideas / etc.

Como ejemplo, mientras reviso un fragmento del código, me tomaré notas constantemente. Esta es mi conversación conmigo mismo. El mero acto de escribir ayuda a que surjan más pensamientos y me ayuda a comprender mejor las cosas. Después de un tiempo, puedo tener un Eureka y necesito dibujar un pequeño diagrama con la "imagen más grande" en papel para ilustrar lo que acabo de pensar o las piezas que acabo de armar. Siempre hago esto solo en papel, eliminando todas las distracciones de la computadora. Esto me permite ser más metódico y reflexivo sobre lo que estoy haciendo.

Esta es básicamente una forma conveniente de tener una conversación perpetua con un experto en dominios :)

Doug T.
fuente
3

Sé que puede sentirse improductivo porque lo está viendo desde la perspectiva de 'Solo estoy agregando registros' cuando, de hecho, está agregando registros y haciendo muchas refactorizaciones. Su supervisor probablemente esté al tanto de la situación del código. Es posible que todos no lo aprecien ahora, pero cuando reciba una solicitud para agregar una característica realmente interesante y desafiante, se alegrará de haber limpiado el código.

JeffO
fuente
Me temo que voy a terminar reescribiendo el proyecto, ya hablamos de eso. Aunque me gusta más esta opción, no agrega productividad al trabajar en código desechable. Sé que es necesario iniciar sesión en la próxima versión, y luego puedo ir con mis cosas, pero es solo tener que ejecutar este código a través de mi cabeza lo que me vuelve loco. Siento que me estoy volviendo más tonto después de entenderlo :-)
Dan
1
"no agrega productividad al trabajar en código desechable" Asegúrese de que sí. Puede pasar por grandes porciones del código trabajando en su comprensión del mismo, mientras realiza una tarea de bajo riesgo (registro). Este conocimiento que está obteniendo será de gran ayuda si se trata de una reescritura. Si no hay una nueva versión, intente esperar la recompensa que sentirá cuando haya limpiado grandes cantidades de la aplicación, cuánto mejor será la base del código debido a sus esfuerzos constantes y persistentes.
quentin-starin
2

En estos casos, tiendo a reescribir una sección de código. Para hacer que un área succione menos y luego solo agrego el registro en otro lugar. Luego limpia un poco más de código. El código incorrecto solo es malo si lo dejas ahí.

Irlanda
fuente
El sistema depende en gran medida de las malas prácticas, por lo que para volver a escribir un método correctamente, tendría que volver a escribir todo el proyecto (lo que probablemente haré eventualmente, pero tengo algunos plazos para el lanzamiento actual).
Dan
Ya entiendo créeme. Simplemente elijo una sección que puedo limpiar sin hacer que mi vida sea dolorosa y la limpie y luego la siguiente área. La fijación de código es un proceso para el que nunca se tiene tiempo, pero que siempre debe tener tiempo.
Erin
2

Gamifica tu trabajo. Por ejemplo, otórguese 5 puntos cada vez que haga una buena pregunta sobre el código y 10 puntos cada vez que lo conteste. Dése una insignia cada vez que refactorice un método o agregue una nueva función. Una vez que acumulas suficientes puntos obtienes privilegios como pausas para tomar café o galletas. Una vez que complete todo el proyecto, tendrá el privilegio de disfrutar de algo que realmente desea.

Algodón Richie
fuente
0

El truco para no aburrirse o enojarse para mantenerse productivo es aceptar que el código está mal diseñado. Aceptar su posición de tener que entender y actualizar el código le permitirá no seguir comentando "cuán estúpido es eso" y, en cambio, aceptarlo en silencio y seguir adelante.

Otro truco es tener un buen hogar que esperar al final del día. Novia, amigos, juegos, todo funcionará, para darle una meta para pasar el día y hacer que valga la pena el mal camino aunque sea un código malo.

Tim
fuente
0

"Trabajar eficazmente con código heredado" de Michael Feathers puede ayudar.

Si te preocupa romper cosas cuando las cambias, primero escribe algunas pruebas, asegúrate de que pasen antes y después de que hagas los cambios. Escribir la prueba debería ayudarlo a resumir y comprender lo que hace un fragmento de código determinado y le permitirá editar con confianza.

Stephen Paulger
fuente
Desafortunadamente, es un proyecto de SharePoint, lo que significa que es casi inestable. He escrito algunos sandboxing geniales para SharePoint en el pasado usando Microsoft Moles pero requiere mucho trabajo adicional.
Dan