¿La refactorización del código está sobrevalorada?

No, y esta es una de las diferencias clave entre el código en una clase CS y el código en el mundo real. Cualquier código que dure será refactorizado varias veces. Los programadores que trabajan pasan mucho más tiempo / esfuerzo arreglando y extendiendo código que escribiendo código nuevo desde cero. Sí, eso es cierto incluso para los programadores (como yo, por cierto) que comienzan proyectos y escriben el código original. Hay un nombre para los programadores que escriben código una vez y esperan que otros arreglen todo a partir de entonces. En realidad, hay varios nombres, de los cuales “prima donna” es el único que podría no violar la política BNBR de Quora. Ninguno de ellos es complementario, y todos serán una gran señal de alerta para los futuros empleadores.

Saber reconocer cuándo la “deuda técnica” que inevitablemente se acumula a partir de muchos pequeños cambios se ha acumulado hasta un punto que justifica la refactorización es una habilidad esencial para un desarrollador de software del mundo real. Lo mismo ocurre con la capacidad de refactorizar de manera eficiente y correcta (a diferencia de una reescritura que a menudo agrega todos los errores cuidadosamente arreglados en el código anterior). Si tuviéramos que elegir entre enseñar a las personas cómo escribir un nuevo código y enseñarles cómo refactorizar, la industria y el público podrían estar mejor atendidos si la mayoría de los programadores solo aprendieran a refactorizar.

Por supuesto no. No escribe código perfecto la primera vez sin importar el marco, las herramientas o el estilo de codificación. Incluso es difícil obtener todos los nombres de variables correctamente la primera vez.

De hecho, está en gran medida subestimado: las personas escriben por la capacidad de prueba pero no por la capacidad de refactorización, que es al menos tan importante (mi sesgo es que es más importante). Estas son algunas de mis experiencias que lo ayudarán a comprender mi punto de vista.

1.) El cliente declara que mantener una lista maestra de datos del equipo aún no es importante. Unos meses más tarde, él / ella declara que es importante, por lo que debe cambiar todo el nombre del equipo a identificadores y desacoplarlo para todas las tablas / objetos que se refieren a ellos. Esto sucederá para abordar datos, activos físicos como edificios, equipos, etc. y activos de tiempo como semestres, trimestres y horarios planificados. Un campo muerto que consideró “solo un campo de texto” “evolucionará” hacia algo más profundo.

2.) El cliente cambia las reglas de negocio sobre la marcha, lo cual es frecuente. Él / ella declararía que “Algunos clientes solo pueden comprar un producto por marca por estos días” o “Algunos productos tendrían un precio diferente a partir de ahora” o “Poner una excepción de que algunos estudiantes podrían inscribirse sin pagar, pero seguirlo” . Este tipo de solicitudes (si la habilidad de refactorización es baja) contaminaría el código con un millón de declaraciones if / else sin vincular por todas partes en lugar de vincular esas declaraciones if / else en una clase (que tendría un nombre razonable como HolidayConstraints o EnrollmentOverrides) .

3.) El programador A crea una función llamada RenderData que es pequeña y razonable. Sin embargo, el Cliente solicita que se presenten más y más datos. El programador B debe dividir RenderData en RenderHeader, RenderSummary y RenderDetails. Si el Programador A escribió RenderData para ser un chat de lectura-impresión-lectura-impresión (porque las solicitudes se hicieron con el tiempo) en lugar de leer-una vez-e-imprimir una vez, el Programador B debería saber cómo refactorizarlo.

4.) Crea un programa que se localizaría (cambiaría de idioma). ¿Cómo desacoplar el etiquetado de la aplicación? Algunos marcos lo hacen más fácil que otros, PERO esto se vuelve más difícil cuando AJAX se involucra.

5.) El programador A (por cualquier razón técnica) crea un proyecto en el que la estructura del archivo no refleja el programa que se está escribiendo. Simplemente no puede mirar las carpetas / archivos (sin abrirlos) y comprender que es un programa de contabilidad. La estructura de archivos es un trillón de relaciones de archivos de inclusión todas llamadas * .jsp o * .php donde el nombre de archivo no se relaciona con la página real. ¿Cómo refactorizar eso? Cambiar el nombre de los archivos de una manera que tenga sentido en una aplicación por aplicación. O puede convertirlo a MVC, lo que sea más fácil. (Sospecho que cambiar el nombre es más fácil)

6.) Tu amigo escribe una extensión en tu código pero no quieres romperlo. Entonces él escribe sus líneas al final de su función o en otra clase. Debe refactorizarlo para que se ajuste a su estilo de codificación e integrarlo si es una extensión central. En serio, debes recordar hacer esto.

Descargos de responsabilidad:
1.) De ninguna manera estoy diciendo refactoring> testing. Estoy diciendo que deben ir juntos. Las pruebas le permiten detectar errores, la refactorización le permite corregir errores de manera más consistente.

2.) Refactorizar no significa desacoplar todo. Significa acoplarlo si el caso de uso está acoplado y desacoplarlo cuando no lo está. Una solicitud web no debe desacoplarse a las transmisiones y encabezados de solicitud, etc., donde lo único que le interesa es la llamada URL. El estilo de codificación que permite acoplar / desacoplar a voluntad con facilidad es el sello distintivo del código refactible. ¿Cómo es esto posible? Control de estado (no haga variables globales incluso en javascript) y estilo funcional de programación. Mi ejemplo anterior es una función acoplada (la función de orden superior para ser formal) llamada RenderData se puede desacoplar a RenderHeader y RenderDetails y viceversa. En términos simples: divisibilidad y capacidad de ensamblaje.

3.) La refactorización no solo incluye el código sino también la estructura del archivo.

Preguntas finales
1.) ¿Puedes sobrevivir a largo plazo con un código refactible sin pruebas? Sí, para muchos proyectos c y c ++ de hecho. Aquí está el kernel de Linux: NO HAY PRUEBAS DE LA UNIDAD pero es altamente refactible (en mi opinión debido a la estructura del archivo) https://github.com/torvalds/linux

2.) ¿Puede sobrevivir a largo plazo con un gran número de pruebas con un código altamente irrefactible? No lo sé y no quiero asumir nada.

No lo es si se aplica con un propósito. Por ejemplo en TDD (desarrollo impulsado por pruebas)

# 1 TDD es una técnica de desarrollo de software basada en la repetición de ciclos de desarrollo muy cortos: la creación de pruebas (desarrollo de código que permitirá pasar esas pruebas) y la refactorización del código para cumplir con los estándares de desarrollo.

Obviamente, deberá refinar el código después de que haya pasado todas las pruebas.

Consejo de refactorización: las técnicas de refactorización aplicadas sin pensar dañarán más de lo que ayudan.

# 2 La refactorización de código a menudo se realiza al transferir un proyecto de un equipo de desarrollo a otro. En este paso, el equipo inicial simplifica el código, lo hace limpio, fácil de digerir y legible, para que el nuevo pueda entenderlo fácilmente y realizar ediciones sin temor a romper algo.

En tal caso, la refactorización de código puede ser esencial antes de pasar la aplicación al mantenimiento.

# 3 CASO OPUESTO. Parece ineficiente ejecutar la refactorización de código cuando se trata de código heredado o un gran proyecto empresarial. Su equipo puede perder mucho tiempo solo averiguando cómo funciona, y luego 2 veces más tiempo para mejorarlo sin dañarlo. Por lo tanto, desde una perspectiva esbelta, es más prudente poner recursos en la construcción encima de esto, o en la reconstrucción de partes vitales, que enredar con el original.

# 4 Poner una etiqueta y prácticas de revisión de código adecuadas es generalmente mucho mejor que recurrir a la refactorización, cuando tienes un solo equipo trabajando en un proyecto.

Aquí hay una respuesta integral por qué posiblemente la necesite.

No. La clave es saber cuándo refactorizar su código. Acabamos de pasar por un proceso de refactorización de nuestra base de código en Instabug (donde trabajo), un SDK para informes de errores y comentarios de los usuarios en la aplicación.

He aquí por qué decidimos asumir este proyecto de meses:

  • Durante el año pasado, Instabug BugSquad ha crecido rápidamente. Con un aumento del 200% en el tamaño del equipo, tuvimos que pensar mucho sobre cómo escalar una empresa de ingeniería sin burocracia adicional y con una productividad mejorada.
  • Sería difícil planificar y mantener sincronizadas las características y los cambios que tocan la funcionalidad principal del SDK en diferentes equipos.
  • Tener ingenieros de diferentes Escuadrones contribuyan a la misma base de código resultaría en un esfuerzo duplicado.
  • Sería difícil dar a cada Escuadrón la flexibilidad para planificar sus lanzamientos y mantener su proceso de lanzamiento optimizado. Queremos eliminar las dependencias entre diferentes escuadrones, pero mantener un marco único significa que los diferentes escuadrones aún dependen unos de otros.
  • Sería mucho más difícil mantener nuestro objetivo de proporcionar un SDK ligero y de alta calidad.

Dados estos desafíos, decidimos refactorizar nuestra base de código. Nuestros objetivos eran resolver los problemas anteriores, además de aumentar la modularidad de nuestro código y alentar la reutilización en diferentes escuadrones.

Si está interesado, consulte esta publicación de blog para obtener detalles sobre los pasos que seguimos para refactorizar nuestro marco monolítico de iOS y los resultados.

No, pero con frecuencia se cambia de lo que es a algo que se impone a los programadores, y que se usa como una excusa para impulsar más BS egoístas (“puedes refactorizarlo”, dicen, lo que implica que todos deberían hacer claramente lo que sea). la estupidez está siendo forzada). La refactorización también a menudo se convierte en un proceso rutinario y programado que se ve forzado en los peores momentos, en lugar de algo que ocurre naturalmente y según sea necesario.

Me encanta refactorizar, y me encanta saber que no tengo que preocuparme demasiado a medida que me desarrollo, porque puedo regresar y reestructurar / reescribir las cosas cuando sea más claro lo que estoy tratando de hacer (no tengo que desperdiciar tiempo en cosas que no importan, puedo seguir con eso). También me encanta lo fácil que es la refactorización, cuánto se puede hacer mediante scripts y cuánto acelera el desarrollo (podría pasar dos semanas resolviendo la estructura perfecta con anticipación, o podría pasar 5 minutos jugando, 20 minutos pensando, 5 minutos escribiendo el código, 1 día haciendo otra cosa, luego otros 5 minutos reorganizando todo).

Probablemente no.

¿No le gustaría que su código sea más rápido, eficiente en memoria, legible, etc.?

La mayoría de nosotros escribiremos código decente, algunos mejores, otros peores. Pero solo unos pocos seleccionados escribirán código que no se puede mejorar en al menos una faceta, suponiendo que estemos escribiendo código en algún período de tiempo.

Incluso si solo estás mejorando la legibilidad. Ponte en la piel de otro desarrollador que revisa tu código. ¿Está clara la lógica de tu código? ¿Qué comportamiento esperas de eso?

No, no es.
No prestar suficiente atención al código de salud puede arruinar una empresa,
y no hay muchas alternativas prácticas para la refactorización de código.

Si y no. Sí, en el sentido de que si el código funciona para la satisfacción de sus jefes, es difícil para ellos ver algún valor en la refactorización del código.

Pero, por otro lado, con bastante frecuencia el código refactorizado será más pequeño, más comprensible, a veces más rápido, a veces más lento, puede ser más fácil de cambiar en el futuro, puede ser más general, etc. Y en la refactorización, puede ver margen de mejora, o más comprobación de errores o almacenamiento en caché, o puede ver errores apareciendo.

Por otro lado, puede romper algo sutil y debe revertirse.

En general, trato de resistir el impulso de refactorizar, a menos que pueda ver beneficios reales y ningún inconveniente, y tenga tiempo.

No, creo que no podemos escribir un código perfecto de una sola vez, me gusta hacer todas mis tareas lo más rápido posible, luego dejar tiempo para la fecha límite simplemente refabricando, si no re factorando, se excederá calificado en mi conocimiento y actualización de mis habilidades tecnológicas, la factorización es una de las mejores partes de mi trabajo

More Interesting

¿Qué desafíos enfrentan los equipos de desarrollo de software al escalar?

Cómo enseñar a mis socios comerciales sobre sprints

Por ser miembro de equipos que envían naves espaciales al espacio, ¿qué especialidad debo elegir? ¿Está relacionada la ingeniería de software?

¿Es seguro seguir una carrera en desarrollo de software o ciencia de datos en Australia? (Seguro en términos de obtención de relaciones públicas, demanda / crecimiento del empleo, salario, etc.)

¿Puede la programación funcional llegar a ser tan importante como OOP en el mundo de la ingeniería de software?

¿Por qué a los ingenieros más alejados del hardware les importa menos la degradación elegante?

¿Cuál es el mejor software para vivir MCX?

¿Qué es el software de microordenador y cuáles son algunos ejemplos?

¿Se incorporan las mejores prácticas modernas de desarrollo (TDD, patrones de diseño, separación de preocupaciones, etc.) en los cursos universitarios de desarrollo de software?

¿Cuál es el alcance de las pruebas de software en el futuro?

¿Cuánto tiempo debería tomar para comprender los requisitos del proyecto en el desarrollo de software? ¿Cómo puede comprender mejor el negocio para el que está desarrollando el software?

¿Quién es un analista de sistemas y cuál es su trabajo (responsabilidades clave)?

¿Hay programadores que escriben código prácticamente libre de errores?

¿Por qué casi todas las compañías de software (en India) solo usan Linux o Unix en sus oficinas?

¿En qué consiste realmente la programación orientada a objetos? ¿Cuál es el punto aparte de la reutilización y la encapsulación?