¿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
"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
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. –