¿Existe un paradigma de programación que promueva hacer que las dependencias sean extremadamente obvias para otros programadores?

26

Trabajo en un Data Warehouse que genera múltiples sistemas a través de muchas corrientes y capas con dependencias tipo laberinto que vinculan varios artefactos. Casi todos los días me encuentro con situaciones como esta: ejecuto algo, no funciona, reviso un montón de código, pero horas después me doy cuenta de que he logrado conceptualizar el mapa de proceso de una pequeña porción de lo que ahora sé se requiere más tarde en el día, así que le pregunto a alguien y me dicen que esta otra secuencia debe ejecutarse primero y que si marcara aquí (indicando una porción aparentemente arbitraria de una enorme pila de otras dependencias codificadas), entonces habría visto esto. Es increíblemente frustrante.

Si pudiera sugerirle al equipo que tal vez sería una buena idea hacer más para hacer que las dependencias entre los objetos sean más visibles y obvias, en lugar de incorporarlas profundamente en niveles recursivos de código, o incluso en los datos que tiene que estar presente debido a que está poblado por otra secuencia, tal vez al referirse a un paradigma de software bien conocido, probado y probado, entonces podría ser capaz de simplificar mi trabajo y el de todos los demás.

Es un poco difícil explicar los beneficios de esto a mi equipo. Tienden a aceptar las cosas tal como son y no "piensan en grande" en términos de ver los beneficios de poder conceptualizar todo el sistema de una manera nueva; realmente no ven eso si puede modelar un sistema enorme eficientemente, entonces hace que sea menos probable que encuentre ineficiencias de memoria, restricciones únicas de flujo y claves duplicadas, datos sin sentido porque es mucho más fácil diseñarlo de acuerdo con la visión original y luego no se encontrará con todos estos problemas que ahora estamos experimentando, lo que sé que es inusual en trabajos anteriores, pero que parecen considerar inevitable.

Entonces, ¿alguien sabe de un paradigma de software que enfatiza las dependencias y también promueve un modelo conceptual común de un sistema con el fin de garantizar la adhesión a largo plazo a un ideal? Por el momento, tenemos un desastre gigante y la solución de cada sprint parece ser "simplemente agreguen esto aquí y aquí y aquí", y yo soy el único preocupado de que las cosas realmente estén empezando a desmoronarse.

Christs_Chin
fuente
2
¿Podría aclarar qué tipo de "dependencias tipo laberinto que vinculan varios artefactos" son? ¿Son dependencias de compilación que podrían resolverse con una herramienta de compilación como Maven? ¿Son dependencias de entrada, donde uno de estos artefactos depende de alguna entrada que no es obvia o clara? ¿Son dependencias clave entre las tablas de la base de datos?
FrustratedWithFormsDesigner
El sistema es PLSQL, Unix bash, OWB, etc., por lo que hay todo tipo de dependencias. A veces, los datos se requieren de un formato determinado, en un lugar determinado, en un momento determinado, por un módulo determinado, pero no es remotamente obvio del código y solo se puede discernir de dos maneras: atravesando una montaña de código, Tomando tal vez días, descubrir que algunos datos tenían un punto y coma delimitador en una parte del sistema que ni siquiera sabías que estaba siendo referenciada ya que estaba enterrada en 10 capas de código llamado recursivamente, o preguntando a alguien, todos los tiempo, todo el tiempo. No promueve la independencia.
Christs_Chin
44
Literalmente todos ellos
Miles Rout
3
Pequeña tangente: como Haskell es vago, no especificas el orden de las operaciones cuando escribes código. Solo especifica dependencias. La función C depende de los resultados de las funciones A y B. Por lo tanto, A y B deben ejecutarse antes que C, pero podría funcionar igual de bien si A se ejecuta primero o si B se ejecuta primero. Solo pensé que eso era interesante.
GlenPeterson el
1
Hay un libro llamado Patrones de diseño (el libro apesta, pero la mayor parte de lo que dice es bueno, excepto un poco sobre singleton). Tiene varias secciones sobre gestión de dependencias.
ctrl-alt-delor

Respuestas:

19

Descubrimiento

Su ausencia afecta a muchas organizaciones. ¿Dónde está esa herramienta que Fred construyó nuevamente? En el repositorio de Git, claro. ¿Dónde?

El patrón de software que viene a la mente es Model-View-ViewModel. Para los no iniciados, este patrón es un completo misterio. Se lo expliqué a mi esposa como "cinco artilugios que flotan sobre la mesa hablando entre sí a través de una fuerza misteriosa". Comprenda el patrón y comprenderá el software.

Muchos sistemas de software no documentan su arquitectura porque suponen que se explica por sí misma o que surge naturalmente del código. No lo es, y no lo hace. A menos que esté utilizando una arquitectura bien definida, las personas nuevas se perderán. Si no está documentado (o bien conocido), se perderán nuevas personas. Y los veteranos también se perderán, una vez que hayan estado alejados del código durante unos meses.

Es responsabilidad del equipo crear una arquitectura organizacional sensata y documentarla. Esto incluye cosas como

  • Organización de la carpeta
  • Referencias del proyecto
  • Documentación de clase (qué es, qué hace, por qué existe, cómo se usa)
  • Proyecto, módulo, montaje, cualquier documentación.

Es responsabilidad del equipo hacer que las cosas estén organizadas y sean reconocibles para que el equipo no reinvente constantemente la rueda.

Por cierto, la noción de que "el código debe autodocumentarse" es solo parcialmente correcta. Si bien es cierto que su código debe ser lo suficientemente claro para que no tenga que explicar cada línea de código con un comentario, las relaciones entre artefactos como clases, proyectos, ensamblajes, interfaces y similares no son obvias, y aún así necesita ser documentado

Robert Harvey
fuente
3
Claro, pero las personas que se inclinan demasiado por los patrones de diseño son parte del problema. Ellos son los que escriben el código sin ninguna documentación, suponiendo que todos los demás entenderán qué demonios hicieron simplemente mirando el código. Además, los patrones de diseño de software no son arquitectura (en su mayor parte).
Robert Harvey
1
¿Dónde está esa herramienta que Fred construyó nuevamente? En el repositorio de Git, claro. ¿Dónde? - Exactamente! El patrón MVC es demasiado específico para el desarrollo front-end (creo), y los patrones solo son útiles si todos en el equipo los conocen, por lo que esto simplemente mueve el problema de las dependencias que no son obvias, a que sean obvias SI todos saben cómo encontrar ellos. Pero el problema presupone que este no es el caso. Como tal, espero que haya algo que promueva una forma realmente obvia de explicar las dependencias que no requiere algún otro marco conceptual aprendido para su uso.
Christs_Chin
77
Se llama "documentación". Más allá de eso, necesita un marco de dependencia sensible que todos admitan. Desafortunadamente, no hay una plantilla repetitiva que pueda colocar en su proyecto; La estructura organizativa del software es algo que su equipo crea, con la ayuda de una arquitectura sensata.
Robert Harvey
55
@RobertHarvey: Escuché recientemente: "Escribimos código que no necesita documentación". Incorrecto. Estás escribiendo código sin documentación.
gnasher729
3
Algunas cosas buenas aquí. Nota: hay una diferencia entre escribir código que no requiere comentarios y escribir documentación de respaldo.
Robbie Dee
10

La mejor manera de abordar este tipo de problemas es de forma incremental. No se frustre y proponga cambios arquitectónicos amplios y radicales. Esos nunca serán aprobados, y el código nunca mejorará. Eso supone que incluso puede determinar los cambios arquitectónicos amplios y amplios correctos para hacer, lo cual es poco probable.

Lo que es probable es que se puede determinar un cambio más pequeño que le han ayudado con el problema específico que acabamos de resolver. Tal inversión de algunas dependencias, añadiendo un poco de documentación, la creación de una interfaz, escribiendo un guión que advierte de que falta una dependencia, etc Por lo tanto proponer que el cambio más pequeño en su lugar. Aún mejor, dependiendo de la cultura de su empresa, pueden tolerar o incluso esperar que realice mejoras como esa como parte de su tarea original.

Cuando realiza estos cambios más pequeños en una parte regular de su trabajo, y con su ejemplo alienta a otros a que también lo hagan, realmente se acumulan con el tiempo. Mucho más efectivo que lloriquear sobre cambios individuales más grandes que no puedes hacer.

Karl Bielefeldt
fuente
2
Estoy de acuerdo con la idea de los cambios incrementales. El problema es que, sin algunos principios organizativos ya establecidos, podría estar creando más caos. Considere el efecto de mover solo un solo proyecto, clase u otro artefacto (del que dependen otros módulos) a una ubicación más sensible.
Robert Harvey
1
Buena cosa. Mis almas a menudo se han vuelto menos arduas por algunas almas diligentes que tienen el nous de agregar una herramienta / widget aquí y allá para crear orden a partir del caos. Si bien no soy un fanático de las resmas y las resmas de documentación, una hoja de trucos bien escrita o una lista puntiaguda de gotchas / características pueden ayudar mucho.
Robbie Dee
+1 por proponer pequeños cambios que es probable que se aprueben. Experimenté eso y me ayudó a convertirme en alguien con más influencia, y luego mis propuestas tuvieron más impacto.
RawBean
2

Arquitectura.

No existe un principio o práctica único, específico y universal que resuelva los problemas de descubrimiento y mantenibilidad que se aplican a todos los aspectos de todo el software. Pero, el término amplio para las cosas que hacen que un proyecto sea cuerdo es arquitectura.

Su arquitectura es el conjunto de decisiones en torno a cada punto de confusión potencial (o histórica), incluida la designación de cómo se toman y documentan las decisiones arquitectónicas. Todo lo relacionado con el proceso de desarrollo, la estructura de carpetas, la calidad del código, los patrones de diseño, etc., son todas las cosas que pueden entrar en su arquitectura, pero ninguna de ellas es una arquitectura.

Idealmente, esas reglas están unificadas por una singularidad mental.

Un pequeño equipo ciertamente puede crear arquitectura en colaboración. Pero, con diferentes opiniones, esto puede conducir rápidamente a un arquitectura muy esquizofrénica que no sirve para mantener la cordura. La forma más sencilla de garantizar que su arquitectura, y los muchos TLA y patrones que contiene, sirvan al éxito del equipo con una singularidad mental es hacer que una sola mente sea responsable de ellos.

Ahora, eso no necesariamente requiere un "arquitecto" para pontificar . Y, aunque algunos equipos pueden querer que una persona con experiencia simplemente tome esas decisiones, el punto principal es que alguien necesita ser dueño de la arquitectura, especialmente a medida que el equipo crece. Alguien mantiene el dedo en el pulso del equipo, modera las discusiones arquitectónicas, documenta las decisiones y supervisa las decisiones y trabaja en adelante para cumplir con la arquitectura y su espíritu.

No soy un gran admirador de ninguna persona que tome todas las decisiones; pero, identificar a un "arquitecto" o "propietario técnico del producto" que es responsable de moderar las discusiones arquitectónicas y documentar las decisiones combate un mal mayor: la difusión de la responsabilidad que no conduce a una arquitectura discernible.

svidgen
fuente
Tiene toda la razón al identificar la difusión de la responsabilidad como responsable de una arquitectura no perceptible. Recientemente se han tomado decisiones para corregir este problema. Siempre creo que una buena solución para esto sería crear un sistema distribuido completo a través de otro sistema de software que actúe como una especie de arnés, donde usted decide qué entra en el sistema, pero decide dónde, según cómo lo programe el arquitecto. Tendría una vista de múltiples sistemas y tecnologías diferentes y los
navegaría
Creo que su punto en esta respuesta es la mejor manera de combatir / prevenir el tipo de cosas de las que habla el OP. Incluso se aplica a heredar un desastre como lo ha hecho el OP.
GWR
1

Bienvenido a Ingeniería de Software (en ambos sentidos);) Esta es una buena pregunta, pero realmente no hay respuestas fáciles, como estoy seguro de que sabe. Realmente se trata de evolucionar hacia mejores prácticas con el tiempo, capacitar a las personas para que sean más hábiles (por definición, la mayoría de las personas en la industria son competencias mediocres) ...

La ingeniería de software como disciplina sufre de construirlo primero y diseñar la mentalidad sobre la marcha, en parte por conveniencia y en parte por necesidad. Es solo la naturaleza de la bestia. Y, por supuesto, los hacks se construyen sobre hacks con el tiempo, ya que los codificadores mencionados implementan soluciones funcionales rápidamente que resuelven la necesidad a corto plazo a menudo a costa de introducir una deuda técnica.

El paradigma que necesita usar es esencialmente obtener mejores personas, capacitar a las personas que tiene bien y enfatizar la importancia de dedicar tiempo a la planificación y la arquitectura. No se puede ser tan "ágil" fácilmente cuando se trabaja con un sistema monolítico. Puede tomar una planificación considerable implementar incluso pequeños cambios. Establecer un excelente proceso de documentación de alto nivel también ayudará a las personas clave a familiarizarse con el código más rápidamente.

Las ideas en las que podría centrarse serían (con el tiempo, gradualmente) aislar y refactorizar las partes clave del sistema de una manera que las haga más modulares y desacopladas, legibles y mantenibles. El truco está en trabajar para cumplir con los requisitos comerciales existentes, de modo que la reducción de la deuda técnica se pueda hacer simultáneamente con la entrega de un valor comercial visible. Por lo tanto, la solución es mejorar las prácticas y habilidades y tratar de avanzar más hacia el pensamiento arquitectónico a largo plazo, como puedo decir, ya lo están haciendo.

Tenga en cuenta que he respondido esta pregunta desde una perspectiva de metodología de desarrollo de software en lugar de una perspectiva de técnica de codificación porque realmente este es un problema mucho más grande que los detalles de codificación o incluso el estilo arquitectónico. Realmente es una cuestión de cómo planeas el cambio.

Brad Thomas
fuente
66
Escucho lo que dices, pero tu respuesta es en última instancia insatisfactoria y, francamente, un poco insultante. Es un problema mayor que solo contratar a mejores personas; incluso en la pequeña tienda en la que trabajo, luchamos con esto, y creo que es más que un problema de personas; Creo que tiene algunos puntos técnicos específicos.
Robert Harvey
1
Estoy de acuerdo en que hay aspectos técnicos, pero creo que son relativamente menores en comparación con el énfasis en una metodología más sólida para planificar el cambio. No veo que se trate tanto de patrones de diseño como de un cambio cultural hacia más planificación y análisis, planificación y análisis más tempranos y una mejor planificación y análisis.
Brad Thomas el
Muy bien, publicaré mi propia respuesta como comparación. No creo que tenga nada que ver con los patrones de software.
Robert Harvey
Brad, gracias por la respuesta. Su respuesta es apreciada, ya que sé que no estoy solo al ser consciente de este problema. Simplemente parece así en mi equipo. También estoy de acuerdo con Robert Harvey, en que este problema está muy extendido y no quiero renunciar a la creencia de que hay una solución, ya sea en un nuevo tipo de software o en una nueva práctica de trabajo.
Christs_Chin
2
Exactamente mi experiencia: debes hacer que los miembros de tu equipo entiendan lo que están haciendo. Veo personas que mezclan MVVM y MVC, otros que usan controles WPF de una manera normal con Windows Forms (o más bien: VB6), personas que programan en C # sin una comprensión básica de la orientación a objetos ... Enséñeles. Enséñales de nuevo. Estar frustrado Enséñeles de nuevo, ... A menudo pensando en rendirse. Y enseñándoles de nuevo ...
Bernhard Hiller
1

Me gusta la idea de convenciones de @ RobertHarvey y creo que ayudan. También me gusta la idea de @ KarlBielefeldt de "documentar sobre la marcha" y sé que es esencial porque esa es la única manera de mantener actualizada la documentación. Pero creo que la idea general es que documentar cómo encontrar todas las piezas de su código, construirlas e implementarlas es importante.

Hace poco envié un correo electrónico a un importante proyecto de código abierto que tenía una configuración XML que generaba código totalmente indocumentado. Le pregunté al responsable: "¿Dónde se documenta este proceso de generación de código XML? ¿Dónde se documenta la configuración de la base de datos de prueba?" y él dijo: "No lo es". Básicamente es un proyecto de contribución única y ahora sé por qué.

Mira, si eres esa persona y estás leyendo esto, realmente aprecio lo que estás haciendo. ¡Prácticamente adoro los frutos de tu trabajo! Pero si pasaste una hora documentando cómo se juntan tus cosas realmente creativas, podría pasar un par de días codificando nuevas funciones que podrían ayudarte. Cuando me enfrento a la pared de ladrillos de "la falta de documentación no es un problema", ni siquiera voy a intentarlo.

En una empresa, la falta de documentación es una gran pérdida de tiempo y energía. Proyectos como ese a menudo se destinan a consultores que cuestan aún más, solo para que puedan descubrir cosas básicas como "dónde están todas las piezas y cómo encajan".

En conclusión

Lo que se necesita no es tanto una tecnología o metodología, sino un cambio de cultura; Una creencia compartida de que documentar cómo se construyen las cosas y por qué es importante. Debería ser parte de las revisiones de código, un requisito para pasar a producción, vinculado a aumentos. Cuando todos crean eso y actúen en consecuencia, las cosas cambiarán. De lo contrario, será como mi contribución fallida de código abierto.

GlenPeterson
fuente
2
Sospecho que parte del problema cultural radica en la creencia ágil de que "si no es parte de una historia de usuario (es decir, no contribuye directamente al valor de las partes interesadas), entonces no es importante". Bazofia. Conversación relacionada aquí: en forma ágil, ¿cómo se planifican y asignan las tareas básicas de infraestructura al comienzo de un proyecto?
Robert Harvey
@RobertHarvey Sí. Todos en mi equipo son increíblemente brillantes y muy fáciles de seguir. Los maestros de scrum y los gerentes de proyecto tienen buenas intenciones e impulso, y las prácticas son las más ágiles en las que he trabajado. Pero falta la documentación, probablemente por la razón que sugieres. Además, cuando se crea la documentación, se introduce una capa adicional de aleatoriedad en la efectividad comunicativa en la capacidad de la persona para identificar conceptos pertinentes y también para explicarlos, sin mencionar su actitud hacia tener que emprender dicha tarea. Por lo general, es solo "Pregúntele a alguien"
Christs_Chin
@GlenPeterson Sí, estoy de acuerdo en que esto sería útil. Pero debe especificarse no solo que debe construirse, sino también cómo y qué califica como documentación. Por ejemplo, como un ejemplo reciente aquí, alguien incluyó una lista de nuevos números que nuestro sistema identificará. Eso es. No se mencionó cómo estos números ingresan al sistema, dónde, por qué, por quién, con qué frecuencia o algo útil, solo que lo hacen. En ningún momento me he preguntado qué números identificará nuestro sistema como relevantes. Pero a menudo me he preguntado, dónde entran, a dónde van y qué sucede en el camino. Sigue siendo un misterio.
Christs_Chin
1
@Christs_Chin Gran parte de la comunicación se basa en el contexto. Sin ese contexto, la mayoría de las comunicaciones son casi sin sentido. Siento tu dolor. Pero creo que es difícil escribir (inglés) para que otros puedan entenderte. A veces, las primeras especificaciones de un sistema tienen el contexto que necesita para comprenderlo, incluso si están terriblemente desactualizadas, el contexto generalmente ayuda.
GlenPeterson
1

Para responder la pregunta tal como se plantea (en lugar de darle consejos para su situación particular):

El paradigma de programación conocido como programación funcional pura requiere que todo lo que afecta la salida de una función se especifique en los parámetros de entrada. No hay dependencias ocultas o variables globales u otras fuerzas misteriosas que actúen de manera invisible en la base del código. No hay un acoplamiento temporal "tienes que hacer esto primero".

JacquesB
fuente
0

Cada almacén de datos es diferente, pero hay muchas cosas que puede hacer para facilitarles las cosas.

Para empezar, cada fila de la base de datos tenía una columna DATE_ADDED y DATA_UPDATED para que pudiéramos ver cuándo se agregó a la base de datos y cuándo se modificó. También teníamos una columna SOURCE_CODE para poder rastrear dónde ingresaba cada bit de datos al sistema.

Luego, teníamos herramientas comunes que funcionaban en todos nuestros almacenes de datos, como géneros, coincidencias de tablas, rebanadoras y cortadoras de dados, etc.

El código a medida se mantuvo en un mínimo absoluto e incluso entonces, tuvo que confirmar varios estilos de codificación e informes.

Asumiré que ya estás familiarizado con las suites ETL . Hay muchas funciones que obtienes de forma gratuita en estos días que no estaban presentes cuando estuve en el juego hace aproximadamente una década.

También es posible que desee ver los data marts para presentar una versión más amigable y desinfectada de su almacén de datos. No es una bala de plata, por supuesto, pero podría ayudar con ciertos problemas en lugar de tener que reconstruir / corregir su almacén de datos.

Robbie Dee
fuente
Gracias por la respuesta. Sí, utilizamos todos estos campos, pero en realidad solo ayudan a identificar una sola fila, no con dependencias entre flujos, capas y sistemas. Tiene razón acerca de las suites ETL: estábamos en el proceso de actualización a una herramienta ETL conocida desde una que no tenía soporte, pero en su lugar, volvimos a PLSQL. Está bien codificar, pero para mantenerlo y comprender el sistema en general desde el nivel de código, es absolutamente terrible.
Christs_Chin
1
Lo ideal es que pueda rastrear los datos de extremo a extremo, ya sea a través de tablas de preparación o archivos planos, pero si no tiene eso, le queda un código para caminar.
Robbie Dee
0

No sé qué tan relevante es para su caso, hay algunas estrategias para hacer que las dependencias sean más visibles y el mantenimiento general del código.

  • Evite las variables globales, use parámetros en su lugar. Esto se aplica también a las llamadas entre idiomas.
  • Evite cambiar / mutar los valores de las variables, tanto como pueda. Cree una nueva variable y úsela cuando sea necesario cambiar el valor, si es posible.
  • Haz el código modular. Si no es posible describir qué parte (no cómo) está haciendo realmente en una oración simple, divídala en módulos que satisfagan la condición.
  • Nombre sus porciones de código correctamente. Cuando realmente puede describir lo que hace una porción de código en términos simples, esos términos se convierten en el nombre de la porción. Por lo tanto, el código se auto documenta a través de nombres de módulos / clases / funciones / procedimientos / métodos, etc.
  • Prueba tu código. Pruebe si las entidades en su código justifican sus nombres, discutidos en el punto anterior.
  • Registrar eventos en el código. Al menos mantenga dos niveles de registro. El primero siempre está habilitado (incluso en producción) y registra solo eventos críticos. Y use el otro para registrar básicamente todo, pero se puede activar o desactivar.
  • Encuentre y use las herramientas adecuadas para navegar, mantener y desarrollar su base de código. Incluso una simple opción de "Buscar todo" de Visual Studio Code me facilitó mucho la vida en ciertos casos.
Gulshan
fuente