2008-12-10 13 views
10

Hace un par de años los medios estaban plagados de todo tipo de artículos sobre cómo la idea de la reutilización de códigos era una forma simple de mejorar la productividad y la calidad del código.¿Hemos renunciado a la idea de la reutilización de código?

De los blogs y sitios que reviso regularmente parece que la idea de "reutilización de código" ha pasado de moda. Tal vez los defensores del 'código reutilización' se hayan unido todos a la multitud de SOA en su lugar? :-)

Curiosamente, cuando la búsqueda de 'la reutilización de código' en Google se titula el segundo resultado :

"Reutilización de Código Interno considera peligroso"!

Para mí, la idea de la reutilización de código es simplemente sentido común, después de todo, mira el éxito del proyecto Apache commons!

Lo que quiero saber es:

  • ¿Usted o su empresa a tratar y reutilizar el código?
  • Si es así, ¿cómo y en qué nivel, es decir, api de bajo nivel, componentes o comparten la lógica comercial? ¿Cómo usan usted o su empresa el código de reutilización?
  • ¿Funciona?

Discuss?


Soy plenamente consciente de que hay muchas librerías de código abierto disponibles y que cualquiera que haya usado el .NET o Java ha reutilizado código de alguna forma. ¡Eso es sentido común!

Me refería más a la reutilización de código dentro de una organización en lugar de a través de una comunidad compartida a través de un lib etc.

pregunté originalmente;

  • ¿Usted o su empresa intentan volver a utilizar el código?
  • En caso afirmativo, ¿cómo y en qué nivel, es decir, api de bajo nivel, componentes o lógica comercial compartida? ¿Cómo usan usted o su empresa el código de reutilización?

Desde donde estoy sentado veo muy pocos ejemplos de compañías que intentan reutilizar el código internamente?

Si tiene un código que podría compartirse potencialmente en una organización de tamaño mediano, ¿cómo informaría a otros miembros de la compañía que esta lib/api/etc existía y podría ser beneficiosa?

Respuesta

9

El título del artículo al que se refiere es engañoso, y en realidad es una muy buena lectura. La reutilización de código es muy beneficiosa, pero hay inconvenientes con todo. Básicamente, si no recuerdo mal, la esencia del artículo es que estás sellando el código en una caja negra y no revisándolo, de modo que cuando los desarrolladores originales te dejan, pierdes el conocimiento. Si bien entiendo el punto, no estoy necesariamente de acuerdo con él, al menos no con la idea de que "el cielo está cayendo".

En realidad, agrupamos la reutilización de códigos en más de solo clases reutilizables, observamos toda la empresa. Las cosas que se parecen más a la mejora del marco o abordan las preocupaciones transversales se ponen en un marco de desarrollo que todas nuestras aplicaciones usan (piense en cosas como la validación previa y posterior, el registro, etc.). También tenemos lógica de negocios que se aplica a más de una aplicación, por lo que ese tipo de cosas se mueven a un núcleo de BAL accesible en cualquier lugar.

Creo que lo importante no es promover cosas para su reutilización si no se van a reutilizar realmente. Deben estar bien documentados, para que los nuevos desarrolladores puedan tener un recurso que les ayude a acelerar también. Lo más probable es que, si el conocimiento no se comparte, el código eventualmente se reinventará en otro lugar y dará lugar a la duplicación si no es riguroso en la documentación y el intercambio de conocimientos.

+0

"El título del artículo al que te refieres ..." No me estaba refiriendo a nada en particular, ¿acaso esto me llamó la atención con algo que has leído antes? Karl – Karl

+0

El segundo resultado que vio en Google. "Reutilización interna del código considerada peligrosa". Es un documento técnico que leí hace un tiempo. –

1

Reutilizamos el código.

A pequeña escala, tratamos de evitar la duplicación de código tanto como sea posible. Y tenemos una biblioteca completa con muchos códigos de uso frecuente.

Normalmente, el código está desarrollado para una sola aplicación. Y si es lo suficientemente genérico, se promociona a la biblioteca. Esto funciona excelente

2

Creo que la reutilización de código se realiza en su mayor parte a través de proyectos de código abierto.Todo lo que puede reutilizarse o ampliarse se realiza a través de bibliotecas. Java tiene una increíble cantidad de bibliotecas de código abierto disponibles para hacer una gran cantidad de cosas. Compare eso con C++, y qué tan temprano tendría que implementarse todo desde cero utilizando MFC o la API de Win32.

1

La idea de la reutilización de códigos ya no es una idea nueva ... de ahí la aparente falta de interés. Pero todavía es una gran idea. Todo el framework .NET y la API de Java son buenos ejemplos de reutilización de código en acción.

Nos hemos acostumbrado a desarrollar bibliotecas OO de código para nuestros proyectos y a reutilizarlas en otros proyectos. Es una parte del ciclo de vida natural de una idea. Se debate acaloradamente durante un tiempo y luego todos aceptan y no hay motivo para una discusión posterior.

1

Por supuesto que reutilizamos el código.

Hay una cantidad casi infinita de paquetes, bibliotecas y objetos compartidos disponibles para todos los idiomas, con comunidades enteras de desarrolladores pidiéndoles apoyo y actualización.

1

Creo que la falta de "atención de los medios" se debe al hecho de que todos lo están haciendo, por lo que ya no vale la pena escribir sobre él. No escucho a tanta gente crear conciencia sobre la Programación Orientada a Objetos y la Prueba de Unidad como solía hacerlo. Todos ya conocen estos conceptos (ya sea que los usen o no).

3

La reutilización de código es esencial. Encuentro que también me obliga a generalizar tanto como sea posible, también haciendo que el código sea más adaptable a situaciones variables. Idealmente, casi todas las bibliotecas de nivel inferior que escriba deberían ser capaces de adaptarse a un nuevo conjunto de requisitos para una aplicación diferente.

+0

".. cada biblioteca de nivel inferior que escriba debe ser capaz de adaptarse a un nuevo conjunto de requisitos para una aplicación diferente" Digamos, por ejemplo, que escribe una lib de JMS de bajo nivel y desea compartirla con la comunidad, ¿cómo iría? sobre compartirlo? Es poco probable encontrarlo en su sitio web personal. – Karl

+0

Hay muchos sitios web, aplicaciones y servicios disponibles para esto. – hmcclungiii

0

Aunque creo que la reutilización de código es valiosa, puedo ver dónde se enraiza este sentimiento. He trabajado en muchos proyectos en los que se tuvo mucho más cuidado para crear código reutilizable que luego nunca se reutilizó. Por supuesto, la reutilización es mucho más preferible que duplicar el código, pero he visto muchos modelos de objetos muy exhaustivos creados con el objetivo de utilizar los objetos en toda la empresa en múltiples proyectos (la forma en que se puede usar el mismo servicio en SOA en diferentes aplicaciones) pero nunca han visto los objetos realmente usados ​​más de una vez. Tal vez simplemente no he sido parte de organizaciones que aprovechan el principio de reutilización.

0

Quizás la mejor pregunta es ¿cuándo NO reutilizamos el código en estos días?Estamos en un estado de construcción usando otras personas observando las "mejores prácticas" o "patrones de diseño" previamente descubiertos o simplemente construyendo sobre el código heredado, bibliotecas o copias.

Parece que el grado de reutilización del código A para hacer el código B a menudo se basa en cuánto se abstraen las ideas del código A del código B en patrones de diseño/modismos/libros/pensamientos fugaces/código real/bibliotecas . La parte más difícil es aplicar todas esas buenas ideas a tu código real.

Los tipos no técnicos se vuelven demasiado entusiastas con respecto a la reutilización. No entienden por qué no se puede copiar y pegar todo. No entienden por qué el greemelfarm necesita un adaptador especial para comunicar la misma información que solía al sistema anterior al nuevo sistema, y ​​que, desafortunadamente, tampoco podemos cambiar debido a un millón de otras razones.

Creo que los técnicos han estado reutilizando desde el primer día de la misma manera en que los músicos han estado reutilizando desde el día 1. Es una evolución orgánica continua y una síntesis que continuará.

0

Los dos proyectos de software en los que he trabajado han sido a largo plazo. Uno tiene alrededor de 10 años, el otro ha existido por más de 30 años, reescrito en un par de versiones de Fortran en el camino. Ambos hacen una extensa reutilización del código, pero ambos dependen muy poco de herramientas externas o bibliotecas de códigos. DRY es un gran mantra en el proyecto más nuevo, que está en C++ y se presta más fácilmente para hacerlo en la práctica.

5

Reutilizamos el código; de hecho, nuestros desarrolladores escriben código específicamente que se puede reutilizar en otros proyectos. Esto ha funcionado bastante bien: podemos comenzar nuevos proyectos rápidamente y endurecemos iterativamente nuestras bibliotecas centrales.

Pero no se puede simplemente escribir código y esperar que se vuelva a utilizar; reutilización de código requiere la comunicación entre los miembros del equipo y otros usuarios para que la gente sepa qué código está disponible y cómo usarlo.

las siguientes cosas son necesarias para la reutilización de código para trabajar con eficacia:

  • El código o una biblioteca en sí
  • demanda para el código a través de múltiples proyectos o esfuerzos
  • Comunicación de las del código de características/capacidades
  • Instrucciones sobre cómo usar el código
  • Un compromiso para mantener y mejorar el código en el tiempo
1

El nivel de atención de los medios a un problema tiene poco que ver con su importancia, ya sea que estemos hablando de desarrollo de software o de política. Es importante evitar perder el esfuerzo de desarrollo reinventando (o re-manteniendo) la rueda, pero esto es tan conocido ahora que un editor probablemente no se entusiasme con otro artículo sobre el tema.

En lugar de mirar el número de artículos actuales y publicaciones de blog como una medida de importancia (o urgencia), mire los conceptos y frases que se han convertido en clásicos o en la jerga (¡otra forma de reutilización!) Por ejemplo , Google utiliza el acrónimo DRY para una buena discusión sobre las muchas formas de redundancia que pueden eliminarse en el software y los procesos de desarrollo.

También existe un papel para el juicio maduro con respecto a los costos de reutilización frente a donde se logran los beneficios. Algunos escritores abogan por esperar a preocuparse por la reutilización hasta que aparezca un segundo o tercer uso, en lugar de gastar esfuerzos para generalizar un poco de código la primera vez que se escribe.

-1

Maven ha resuelto la reutilización de código. Soy completamente serio.

+0

Maven hace que sea bastante fácil describir las dependencias entre los elementos de software, pero aún debe tener en cuenta la duplicación de código en las cosas que escribe. – Kwebble

0

La reutilización de código es un problema extremadamente importante: cuando el código no se reutiliza, los proyectos tardan más y es más difícil para los nuevos miembros del equipo entrar.
Sin embargo, escribir código reutilizable lleva más tiempo.
Personalmente, trato de escribir todo mi código de forma reutilizable, esto lleva más tiempo, pero resulta en el hecho de que la mayoría de mi código se ha convertido en infraestructuras oficiales en mi organización y que los nuevos proyectos basados ​​en estas infraestructuras toman menos tiempo.
El peligro en el código de reutilización es si el código reutilizado no está escrito como una infraestructura, de manera general y encapsulada con la menor cantidad posible de suposiciones y la mayor cantidad posible de documentación y pruebas de unidades, que el código puede terminar haciendo cosas inesperadas.
Además, si se encuentran errores y se reparan, o se agregan características, estos cambios rara vez se devuelven al código fuente, lo que da como resultado diferentes versiones del código reutilizado, que nadie conoce ni comprende.

La solución es:
1. Diseñar y escribir el código teniendo en cuenta no solo un proyecto, sino pensar en los requisitos futuros e intentar que el diseño sea lo suficientemente flexible para cubrirlos con un mínimo cambio de código.
2. Para encerrar el código dentro de las bibliotecas que se utilizarán como están y no se modifican dentro de los proyectos.
3. Para permitir a los usuarios ver y modificar el código de la biblioteca con su solución (no dentro de la solución del proyecto en uso).
4. Diseñar proyectos futuros basados ​​en las infraestructuras existentes, realizando cambios en las infraestructuras según sea necesario.
5. Cargar el mantenimiento de la infraestructura a todos los proyectos, manteniendo así la infraestructura financiada.

1

Mi punto de vista personal, basada en la práctica en mi empresa:

  • ¿Usted o su empresa a tratar y reutilizar el código?

Obviamente, si tenemos otra pieza de código que ya se ajusta a nuestras necesidades vamos a volver a utilizarlo. Sin embargo, no salimos de nuestro camino para usar clavijas cuadradas en agujeros redondos.

  • Si es así cómo y en qué nivel, es decir, de bajo nivel de API, componentes o lógica de negocio compartido? ¿Cómo usan usted o su empresa el código de reutilización?

En todos los niveles. Está escrito en nuestros estándares de codificación que los desarrolladores siempre deben asumir que su código será reutilizado, incluso si en realidad eso es muy poco probable. Ver abajo

Si su modelo OO es buena, su API probablemente refleja su dominio del negocio, por lo que las clases reutilizables probablemente equivale a la lógica de negocio reutilizable y sin esfuerzo adicional.

Para la reutilización real, un punto clave es saber qué código ya está disponible.Resolvemos esto al tener todo documentado en una ubicación central. Solo necesitamos un poco de disciplina para garantizar que la documentación esté actualizada y pueda buscarse de manera significativa.

  • ¿Funciona?

Sí, pero no debido a la reutilización potencial o real! En realidad, más allá de algunas bibliotecas básicas y componentes de UI, no hay una gran cantidad de reutilización.

En mi opinión personal, el valor real está en hacer el código reutilizable. Al hacerlo, aparte de una API con la esperanza de que sea más limpia, el código (a) estará documentado lo suficiente para que otro desarrollador lo use sin pescar el código fuente, y (b) también será reemplazable. Estos puntos son un gran beneficio para el mantenimiento continuo del software.

0

¿Usted o su empresa intentan volver a utilizar el código? En caso afirmativo, ¿cómo y en qué nivel de , es decir, api de bajo nivel, componentes o lógica comercial compartida? ¿Cómo usted 0 su código de reutilización ?

Solía ​​trabajar en una base de código con la reutilización de código uber, pero era difícil de mantener porque el código reutilizado era inestable. Era propenso a los cambios de diseño y la desaprobación de manera que caía en cascada a todo lo que lo usaba. Antes de eso, trabajé en una base de código sin reutilización de código donde las personas mayores alentaban realmente a copiar y pegar como una forma de reutilizar incluso el código específico de la aplicación, así que pude ver las dos extremidades y tengo que decir que una no es necesariamente mucho mejor que el otro cuando se lleva a los extremos.

Y solía ser un tipo de programador uber bottom-up. Me pides que construya algo específico y termino construyendo herramientas generalizadas. Luego, usando esas herramientas, construyo herramientas generalizadas más complejas, luego empiezo a construir abstracciones DIP para expresar los requisitos de diseño para las herramientas de nivel inferior, luego construyo herramientas aún más complejas y las repito, y en algún momento empiezo a escribir código que realmente funciona. qué quieres que haga. Y a pesar de lo contraproducente que sonó, fui bastante rápido y pude enviar productos complejos de maneras que realmente sorprendieron a la gente.

¡El problema fue el mantenimiento en los últimos meses! Después de que construí capas y capas de estas bibliotecas generalizadas y las volví a usar al máximo, cada una quería servir a un propósito mucho mayor que el que me pediste que hiciera. Cada capa quería resolver las necesidades de hambre del mundo. Entonces cada uno era muy ambicioso: una biblioteca de matemáticas que quiere ser increíble y resolver las necesidades de hambre del mundo. Luego, algo construido sobre la biblioteca matemática como una biblioteca de geometría que quiere ser increíble y resolver las necesidades de hambre del mundo. Sabes que algo anda mal cuando intentas enviar un producto, pero tu mente reflexiona sobre qué tan bien funciona tu biblioteca de geometría súper generalizada para renderizar y modelar cuando se supone que debes trabajar en animación porque el código de animación que estás trabajando on necesita algunas nuevas funciones de geometría.

equilibrio entre las necesidades de todos los usuarios

que se encuentran en el diseño de estas bibliotecas uber-generalizada que tuve que obsesionarse con las necesidades de cada miembro del equipo, y tuve que aprender cómo funcionaba el trazado de rayos, cómo funcionaban los fluidos dinámicas cómo funcionaba el motor de malla, cómo funcionaba la cinemática inversa, cómo funcionaba la animación de personajes, etc. etc., etc.Tuve que aprender a hacer el trabajo de casi todo el mundo en el equipo porque estaba equilibrando todas sus necesidades específicas en el diseño de estas bibliotecas uber generalizadas que dejé atrás mientras caminaba por la cuerda floja de compromiso de diseño de la reutilización de todos los códigos (intentando para mejorar las cosas para Bob que trabaja en raytracing que está usando una de las bibliotecas pero sin lastimar demasiado a John que está trabajando en física y que también lo está usando pero sin complicar demasiado el diseño de la biblioteca para hacer que ambos estén contentos).

Llegué a un punto en el que estaba tratando de parametrizar cuadros delimitadores con clases de política para que se pudieran almacenar como centro y de la mitad del tamaño que una persona quería o mín./Máx. Extensiones como alguien más quería, y la implementación se estaba complicando muy rápido intentando frenéticamente mantenerse al día con las necesidades de todos.

Diseño Comité Por

Y debido a que cada capa estaba tratando de servir a una amplia gama de necesidades (mucho más amplias de lo que realmente es necesario) tal, que encontraron muchas razones para requerir cambios en el diseño, a veces por el comité solicitada- diseños (que generalmente son algo burdos). Y luego, esos cambios de diseño aparecerían en cascada hacia arriba y afectarían a todo el código de nivel superior al usarlo, y el mantenimiento de dicho código comenzó a convertirse en un PITA real.

Creo que potencialmente puede compartir más código en un equipo de ideas afines. La nuestra no tenía la misma mentalidad. Estos no son nombres reales, pero tendría a Bill aquí que es un programador y programador de GUI de alto nivel que crea buenos diseños para el usuario final pero un código cuestionable con muchos hacks, pero tiende a estar bien para ese tipo de código. Aquí tengo a Bob que es un viejo temporizador que ha estado programando desde la época de la tarjeta perforada, a quien le gusta escribir 10.000 funciones de línea con "gotos" en ellas y aún no entiende el tema de la programación orientada a objetos. Aquí tengo a Joe que es como un asistente matemático pero escribe código que nadie más puede entender y siempre hace sugerencias que están matemáticamente alineadas, pero no necesariamente tan eficiente desde un punto de vista computacional. Luego, conseguí que Mike, que está en el espacio ultraterrestre, quiera que conectemos el software a iPhones y cree que todos deberíamos seguir las normas y estándares de ingeniería de Apple.

Tratar de satisfacer las necesidades de todos aquí mientras se presenta un diseño decente fue, probablemente en retrospectiva, imposible. Y en todos los que intentan compartir el código de cada uno, creo que nos volvimos contraproducentes. Cada persona era competente en un área, pero tratar de elaborar diseños y normas con los que todos estén contentos acaba llevando a todo tipo de inestabilidad y ralentizó a todos.

dilemas de

Así que estos días he encontrado el equilibrio es evitar la reutilización de código para las cosas de nivel más bajo. Uso un enfoque de arriba hacia abajo desde el nivel medio, quizás (algo que no es demasiado muy divorciado de lo que me pediste que haga), y construí una biblioteca independiente allí que aún puedo hacer en un corto período de tiempo, pero la biblioteca no tiene la intención de producir mini-libs que intenten resolver las necesidades de hambre del mundo. Por lo general, estas bibliotecas tienen un propósito un poco más estrecho que las de nivel inferior (por ejemplo, una biblioteca de física en lugar de una biblioteca de intersección de geometría generalizada).

YMMV, pero si hay algo que he aprendido a través de los años de la manera más difícil posible, es que podría haber un acto de equilibrio y un punto en el que podríamos evitar deliberadamente la reutilización de código en un entorno de equipo nivel, abandonando cierta generalidad por el código de nivel más bajo a favor de desacoplamiento, teniendo código maleable podemos conformarnos mejor para atender necesidades más específicas en lugar de generalizadas, y demás - tal vez incluso dejando que todos tengan un poco más de libertad para hacer las cosas a su manera.Pero, por supuesto, todo esto es con el objetivo de seguir produciendo una biblioteca generalizada muy reutilizable, pero la diferencia es que la biblioteca podría no descomponerse en las bibliotecas generalizadas más pequeñas, porque descubrí que cruzar un cierto umbral e intentar crear demasiadas las bibliotecas pequeñas y generalizadas comienzan a convertirse en un esfuerzo extremadamente contraproducente a largo plazo, no en el corto plazo, sino a largo plazo y en un amplio esquema de cosas.

Si usted tiene un pedazo de código que potencialmente podrían ser compartidos a través de una organización tamaño medio, ¿cómo usted va sobre informar a otros miembros de la empresa que existía este lib/api/etc y podría ser de beneficio ?

De hecho, me siento más reticentes en estos días y parece que es más perdonable si los colegas hacen un trabajo redundante porque me gustaría que para asegurarse de que el código hace algo bastante útil y no trivial y está también muy bien probado y diseñado antes de intentar compartirlo con otras personas y acumular un montón de dependencias. El diseño debe tener muy pocas razones para requerir cambios a partir de ese momento si lo comparto con el resto del equipo.

De lo contrario, podría causar más dolor del que realmente ahorra.

Solía ​​ser tan intolerante con la redundancia (en código o esfuerzos) porque parecía traducirse en un producto que era muy defectuoso y explosivo en el uso de la memoria. Pero me enfoqué demasiado en la redundancia como el problema clave, cuando realmente el problema real era la mala calidad, el código escrito apresuradamente y la falta de pruebas sólidas. El código bien probado, confiable y eficiente no sufriría ese problema casi en gran medida, incluso si algunas personas duplican, digamos, algunas funciones matemáticas aquí y allá.

Una de las cosas de sentido común que hay que recordar y que no recuerdo en ese momento es la forma en que no nos importa la redundancia cuando utilizamos una biblioteca de terceros muy sólida. Lo más probable es que usen una biblioteca de terceros o dos que tengan un trabajo redundante con lo que su equipo está haciendo. Pero no nos importa en esos casos porque la biblioteca de terceros es excelente y está bien probada. Recomiendo aplicar esa misma forma de pensar a su propio código interno. El objetivo debe ser crear algo asombroso y bien probado, no preocuparse por un poco de redundancia aquí y allá como erróneamente lo hice hace mucho tiempo.

Por lo tanto, estos días he cambiado mi intolerancia hacia la falta de pruebas en su lugar. En lugar de enojarme por los esfuerzos redundantes, ¡me resulta mucho más productivo molestarme por la falta de unidad y las pruebas de integración de otras personas! :-D

Cuestiones relacionadas