2008-09-28 16 views
15

Hace algunos años me contaron acerca de un estudio sobre la reutilización de código. Aparentemente, se descubrió que, en promedio, los programadores tienen una ventana de 7 minutos cuando buscan el código para reutilizar. Si no encuentran el código que se adapte a sus necesidades dentro de esa ventana, escribirán el suyo.¿Qué técnicas usas para maximizar la reutilización del código?

Esto se presentó en el contexto de la necesidad de administrar cuidadosamente su código para reutilizarlo para asegurarse de que puede encontrar lo que necesita dentro de la ventana.

¿Cómo administra usted (personas y organizaciones) su fuente para que sea más fácil su reutilización? ¿Mantiene específicamente una biblioteca de reutilización? Y si es así, ¿cómo lo indexa para maximizar su tasa de acierto?

Respuesta

10

Una pregunta compleja:

  • Algunas partes del código se pueden generalizar como librerías o APIs. Tenemos una biblioteca común que se mantiene actualizada con soluciones a problemas comunes. Típicamente: validación, almacenamiento en caché, clases de acceso a datos, registro, etc. ...

  • Algunas piezas son específicas de la aplicación. No se pueden generalizar fácilmente. Los convertimos en HowTos y hacemos presentaciones internas. El código también se recicla mediante el uso de un SCM fácilmente navegable (en nuestro caso, SVN).

  • También tenemos herramientas que generan código que una mano no se puede reciclar, en la otra siempre es similar (piense en llamar a un procedimiento almacenado).

  • La programación de pares también es una forma útil de difundir el conocimiento de las soluciones existentes. Usamos eso cuando sea posible o apropiado.

  • La última técnica es la matrícula. Cada codificador tiene un tutor al que hacer referencia. Dado que los tutores son pocos, hay mucho intercambio entre ellos y este conocimiento se puede difundir de arriba hacia abajo.

4

Refactor sin piedad y espero lo mejor.

actualización (más prudente 4 años más tarde y es de esperar)

  • Al igual que el comentario de S. Lott dice: Tener en cuenta las Naming. Difunde la palabra a todos los "committers" en el equipo. Los buenos nombres hacen que las cosas se puedan buscar y, por lo tanto, reduce la duplicación.
  • TIENE UNA forma de hacer algo y mantenerlo ACCESIBLE y BÚSQUEDA.
  • Escriba el código para el programador promedio (L.C.D.) .. No sea inteligente donde lo simple sea suficiente. (Eso incluye la compulsión de hornear zapato de patrón de diseño y desórdenes relacionados)
  • Adopte un conjunto común de convenciones, estilos, directrices, estándares, etc. temprano. Asegure la aceptación y, por lo tanto, el cumplimiento dentro del equipo. (¡Esto significa que todos usan las pestañas (o espacios)!). No importa lo que elija, el objetivo es que el código se vea coherente
  • Tenga un guardián (respetado por el equipo), que observa todos los registros de banderas rojas.
  • Escribir código test-first/outside-in. Por lo general, esto asegura que tu código sea utilizable por múltiples clientes.(Consulte la viñeta de GOOS sobre la independencia del contexto)
+0

Buenos nombres para las cosas refactored. No de dónde vino o qué solía hacer, o dónde se usa actualmente, sino qué es REALMENTE. –

1

Intente utilizar TDD si su ya no es mi repsonse inicial.

Creo que el uso de TDD es una gran manera de mantener el acoplamiento de código bajo, entre otros beneficios. Si bien eso no impide que el mismo comportamiento se implemente dos veces, hace que sea mucho más fácil cuando identifica un área en la que puede eliminar la duplicación.

Otro beneficio, TDD tiene un paso para eliminar dupication (refactoring) como parte del ciclo.

Además, las pruebas forman parte de la documentación de los códigos, por lo que es más fácil identificar el comportamiento duplicado.

2
  • Tienen un marco que se admite activamente.

  • Conozca la base de código existente/haga que los otros desarrolladores conozcan la base de código. Si su grupo/compañía es lo suficientemente grande, tenga a alguien que conozca la base de códigos y se le puede pedir orientación.

  • Documento, documento, documento. El código no documentado es inútil para su reutilización porque lleva demasiado tiempo entender su funcionamiento interno.

  • Tiene buenas interfaces. Tipos fáciles, estructuras o clases fáciles. Cuanto más complicado es algo, menos será utilizado en otro proyecto.

  • Optimizar y depurar código reutilizable. Los desarrolladores que experimenten errores en el código de otras personas por enésima vez comenzarán a codificar el código ya existente de nuevo.

1

Organización es la clave. Si espacios de nombres e intellisense están disponibles, la función correcta se puede restringir y finalmente encontrar. Si no encuentran exactamente lo que quieren, es posible que encuentren algo cercano o relacionado. El código que simplemente se mezcla en un solo grupo lo hace fácil de encontrar, pero las personas nunca encontrarán el método que desean lo suficientemente rápido.

La consistencia es también crítica, tanto con el nombre como con la ubicación. Si decide cambiar su estilo en algún momento del proyecto, retroceda y cambie todo para que se ajuste a ese estilo. Puede ser un proceso muy largo y aburrido, pero es mejor que tratar de tener que utilizar una biblioteca incoherente.

1

Perfile toda la aplicación e inicie la refactorización desde la sección más pesada del código. (80% del tiempo empleado en el 20% de la mayoría del código utilizado)

utilizar una herramienta de perfilado que tiene la capacidad de identificar pérdidas de memoria, llamadas repetidas, llamadas largas, memoria unfreed, recursos no vendida, etc ,.

Por norma, el nuevo código siempre utiliza las mejores prácticas.

0

¿Cómo administra usted (personas y organizaciones) su fuente para hacer ¿es más fácil de volver a utilizar? ¿Mantiene específicamente una biblioteca de reutilización? Y si es así, ¿cómo lo indexa para maximizar su tasa de acierto?

no lo hago y no tengo una opinión ciertamente controvertido aquí pero encontrar la idea de maximizar la reutilización de código contraproducente (estoy interpretando "maximizar" como priorizar por encima de todas las otras cosas en lugar de considerarla como tener ventajas y desventajas para equilibrar en consideración). Prefiero, en cambio, permitir que una buena cantidad de esfuerzos redundantes en equipos se deslicen a favor de desacoplar y aislar mejor el módulo de cada desarrollador. En primer lugar antes de que todo el mundo empieza en desacuerdo conmigo a izquierda y derecha, creo que podemos estar de acuerdo en algunas cosas:

  1. La reutilización de código erróneo que tendrá que pasar horas de depuración código de otras personas no es deseable.
  2. Reutilizar código que equilibre un rango tan amplio de necesidades dispares que apenas satisface sus propias necesidades y requiere pasar por muchos aros para finalmente obtener una solución incómoda e ineficiente no es deseable.
  3. Reutilizar código que requiere cambios de diseño constantemente y pasa por depredaciones de un tipo que requerirá que reescriba el código usándolo cada 6 meses no es deseable si hubiera podido implementar la solución usted mismo en media hora en formas que no Necesito cambios de diseño en el futuro ya que solo está satisfaciendo sus necesidades precisas.
  4. Una base de código llena de código de aspecto extraño no es deseable en comparación con una que usa más el lenguaje y la biblioteca estándar de maneras idiomáticas y familiares, incluso si eso requiere un poco más de código.
  5. Los desarrolladores pisando los dedos de los demás porque ambos desean realizar cambios incompatibles en el mismo diseño, mientras que pelear y discutir y realizar cambios que causan errores en las implementaciones de los demás no es deseable.
  6. No es deseable tirar un montón de dependencias a diseños inmaduros que no se han probado (no tuvo una cobertura de prueba exhaustiva, no tuvo el tiempo de realmente insonorizar el diseño y asegurarse de que satisfaga efectivamente las necesidades del usuario sin requerir más cambios de diseño) .
  7. Tener que incluir/importar/vincular un bote de bibliotecas y clases/funciones con el script de compilación más complejo para escribir algo simple es indeseable.
  8. Más que nada, reutilizar el código de una manera que cuesta mucho más tiempo tanto a corto como a largo plazo que no reutilizarlo no es deseable.

Afortunadamente, al menos podemos estar de acuerdo en estos puntos. El problema que he encontrado al maximizar la reutilización de código de colegas excesivamente entusiastas es que a menudo conduce a uno o más de los problemas anteriores. El problema fundamental no era directamente el entusiasmo por la reutilización del código, sino que las prioridades estaban sesgadas hacia la reutilización del código en lugar de la cobertura de prueba, los diseños de insonorización, asegurarse de que las cosas estuvieran lo suficientemente maduras antes de reutilizarlas como locos, y así sucesivamente.

Naturalmente, si todo el código que reutilizamos funcionaba maravillosamente, tenía una cobertura de prueba exhaustiva, se demostró que satisfacía las necesidades de todo lo que lo usa de manera mucho más productiva que no reutilizarlo, y no tuvo que pasar por cambios de diseño durante años, me encantaría la reutilización del código. Pero mis experiencias a menudo descubrieron que las cosas no cuadraban demasiado con este ideal en formas en las que la reutilización del código se estaba convirtiendo en un problema de mantenimiento en lugar de la solución.

¿Cómo administra usted (personas y organizaciones) su fuente para hacer es más fácil de reutilizar? ¿Mantiene específicamente una biblioteca de reutilización? Y si es así, ¿cómo lo indexa para maximizar su tasa de acierto?

Así que, de nuevo, no trato de "maximizar" la reutilización de código entre código propietario escrito internamente entre el equipo. Procuro asegurarme de que el equipo no dedique una enorme cantidad de tiempo al esfuerzo redundante, pero dejo que las cosas se deslicen bastante si tanto los físicos como los que realizan el renderizado implementan su propia clase de cuadro delimitador alineado con el eje, p. No es necesariamente tan redundante, ya que el físico podría usar representaciones min/max que son más eficientes para su propósito, mientras que el desarrollador de renderizado podría usar representaciones de centro/medio tamaño. Trato de asegurarme de que reutilicemos la mayor cantidad de la biblioteca estándar cuando sea posible, porque se trata de una reutilización de código prácticamente garantizada, sólida, bien probada y que no requiere más cambios de diseño (otros equipos gastan una carga de barco). de su tiempo para asegurarse de eso).

En cambio, cambio el enfoque en las pruebas. Un módulo que duplique un poco de código aquí y allá está totalmente bien si me preguntas si funciona maravillosamente de manera que haga felices a los usuarios, tiene una cobertura de prueba completa y no garantiza cambios interminables. Aceptamos dicha duplicación todo el tiempo cuando utilizamos bibliotecas de terceros que probablemente dupliquen algún código que también tenemos en nuestra base de código interno. No es un problema cuando la redundancia no conduce a esfuerzos de mantenimiento redundantes.

Así que sugiero simplemente relajar la idea de maximizar la reutilización de código un poco. Pero si quiere que sea más fácil reutilizar el código realmente sólido, bien probado y no trivial, entonces me ha resultado mucho más útil organizar bibliotecas de propósito único, como una biblioteca "matemática", biblioteca de procesamiento de "imágenes", etc., en lugar de tratar de fusionarlas en algo como "núcleo" o "común". Los últimos tipos tienden a tentar a los desarrolladores a incluir todo tipo de funciones de utilidad eclécticas que apenas benefician al equipo que las usa, y en su mayoría tiende a ensuciarse en formas en que comienza a ser difícil encontrar algo de interés.

Cuestiones relacionadas