¿Qué les dirías a los jefes que piensan que los trabajos de programación son intercambiables?

Estoy en esta compañía de software, y hasta ahora solo he tenido dos gerentes, pero ambos ven los trabajos de programación como no muy diferentes de poner ladrillos. Siempre enfatizaron que debemos asumir los trabajos de los demás en cualquier momento.

Como resultado, nuestro código tiene "propiedad grupal": nadie es dueño de nada y nadie es responsable de nada tampoco. O, en otras palabras, todos son dueños de todo y todos son responsables de todo. Si algo se rompe, cualquiera puede ser enviado a apagar el fuego, independientemente de quién haya creado el problema. Si abres el código, es bastante caótico, porque diferentes personas tienen diferentes formas de hacer las cosas. Además, arreglar el código de otros sin dedicar mucho tiempo a entenderlo primero rápidamente termina con parches sobre parches sobre parches. Esto nunca molesta a nuestros jefes, porque están orientados a resultados; es decir, nunca se molestan en mirar nada a nivel de código.

Puede que alguien no lo crea, pero es absolutamente cierto, ¡y somos una empresa de software puro!

La justificación que tienen es que cuando todos son responsables de todo, cuando alguien se va de vacaciones, otros pueden/deben simplemente intercambiar y cubrirlo, para que pueda disfrutar de las vacaciones en cualquier momento. Una vez, un chico se había estado preparando para un nuevo módulo durante más de un mes, luego se tomó unas vacaciones y, justo antes de irse, le dijo a nuestro jefe que todos los problemas estaban resueltos y que estaba listo para comenzar a codificar. Entonces, en el scrum del día siguiente, mi jefe me dijo, tenemos que terminar esto la próxima semana, ¿puedes recogerlo, por favor?

Simplemente no podía creer lo que escuché, ese tipo lo preparó durante más de un mes, pero nunca había compartido sus hallazgos con nadie más, y ahora mi jefe quiere que lo recoja, de la nada, sin ningún conocimiento previo. y terminarlo en una semana.

No puedo recordar los detalles, pero tuve la suerte de encontrar algunas razones/excusas logísticas para esquivar la bala letal. No tiene el concepto de que hacerse cargo del trabajo de otros a mitad de camino es lo más doloroso para los programadores.

¿Es esto común para las empresas de software? ¿Cómo me sugerirías darle la mala noticia a estos tipos (despistados), que programar es muy diferente a poner ladrillos, sin que se sientan avergonzados, y también convenciéndolos, porque ambos creen firmemente que todos deben ser responsables de todo?

Hooookay amigos, muchas charlas y discusiones aquí. Tenga en cuenta que los comentarios no son para una discusión prolongada: todo se movió al chat . Por favor, lleve también más meta-discusión a esa sala de chat. ¡Gracias!

Respuestas (13)

Les diría que tienen razón, entonces, ¿cómo vamos a lograr ese objetivo en la práctica?

En principio, se trata de un objetivo loable y alcanzable. Veamos los detalles:

Si cada desarrollador trabaja de forma aislada en su pequeña isla con su propio estilo y toma sus propias decisiones de forma independiente, esta es una receta para el desastre. ¿Cómo se integrará su trabajo con el de los demás? ¿Qué pasa si están enfermos o de vacaciones? ¿Qué pasa si, Dios no lo quiera, tienen un accidente y no pueden trabajar o incluso mueren? Si es la única persona que sabe cómo funciona su código y sus compañeros de trabajo necesitan una gran inversión de tiempo para entender el trabajo de esa persona, ¡esto amenaza la continuidad de la empresa! (Esto a veces se conoce como el Factor Bus ).

Al mismo tiempo, cada desarrollador tiene su propio conjunto de habilidades y especializaciones. ¡No todos serán igualmente competentes con todo y eso está bien! Después de todo, es por eso que están trabajando juntos como un equipo hacia un objetivo común.

Entonces, ¿qué se debe hacer para lograr una situación viable?

En primer lugar, el equipo debe sentarse y elegir un conjunto de pautas de codificación para adoptar, o armar su propio conjunto. Esto elimina el factor 'caos' del código: dado que todos harán las cosas de la misma manera, debería ser mucho más fácil para los compañeros programadores entender cómo funcionan las cosas.

En segundo lugar, se debe establecer un sistema que brinde la oportunidad de compartir el conocimiento. Si se espera que dedique todo su tiempo a escribir código, no hay tiempo para compartir conocimientos, por lo que el problema persiste. Los programadores deben tener tiempo para documentar su código o para compartir activamente su conocimiento con otros, o idealmente ambos . También se deben establecer pautas para la documentación del código para evitar posibles problemas que surgirían de una documentación incompleta o insuficiente. Si bien un experto puede comprender una función con unas pocas líneas cortas, alguien que no trabaja con la función regularmente necesitará un poco más de información para ponerse al día. La documentación debe proporcionar suficiente información para el segundo caso.

Idealmente, este intercambio de conocimientos está respaldado por revisiones periódicas del trabajo de cada uno. Esto brinda al revisor la oportunidad de aumentar su conocimiento del código y, al mismo tiempo, ayuda a su equipo a aumentar la calidad general del código, ya que el par de ojos adicional ayudará a detectar posibles errores. También ayuda al equipo a aumentar su comprensión de la calidad general del producto. Si muchas cosas tienen que ser resueltas de una manera 'hacky' entonces obviamente la calidad del producto será mucho más baja que si los mismos problemas pudieran ser resueltos con código agradable y limpio.

Para robar la analogía del barbero, lo ideal es que todos los barberos (codificadores) puedan terminar el trabajo de los demás porque:

  • todos usan el mismo conjunto de peinados

  • todos cortan con técnicas y herramientas que son iguales o al menos equivalentes

  • documentan su progreso en el corte de cabello utilizando un sistema acordado, anotando lo que han hecho, cómo lo han hecho y por qué lo han hecho de esa manera

  • regularmente se toman un poco de tiempo para revisar el trabajo de los demás, ayudándolos a familiarizarse con él

Para abordar la 'actitud' del OP hacia el problema, es muy posible que en realidad, con el tiempo que tienen los programadores (debido a los plazos y las expectativas sobre cómo se gasta su tiempo) y la naturaleza altamente especializada del trabajo de cada programador, este objetivo es inalcanzable en la práctica. De todos modos, es mucho más fácil ayudar a sus gerentes a ver por sí mismos por qué la meta es inalcanzable, luego afirmar que este es el caso y luego tener que defenderlo. Por lo tanto, si alguien propone algo con lo que usted ve problemas importantes, trate de responder con una actitud constructiva, es decir , "Claro, pero ¿cómo vamos a resolver X, Y y Z?" en lugar de responder con una respuesta negativa, es decir , "¡Eso nunca va a funcionar, debido a X, Y y Z!". Esto ayuda a que la gerencia lo perciba de una manera más positiva y, al final, es probable que genere un ambiente de trabajo mejor y más agradable.

Si lograr la meta A significa gastar mucho tiempo, esfuerzo o dinero en resolver los problemas X, Y y Z, entonces puede que no valga la pena, pero esta es una decisión que debe tomar la gerencia, por lo que es nuestro trabajo como empleados proporcionar con la información necesaria para llegar a una decisión bien informada.

Sí, una respuesta constructiva que sugiere una solución constructiva.
Sería bueno que todo el equipo directivo pudiera intercambiar puestos de trabajo también. ¿El presidente está fuera? No hay problema.
"Sería bueno si todo el equipo de administración también pudiera intercambiar trabajos" , jaja, eso es bueno, realmente bueno.
"Si es la única persona que sabe cómo funciona su código y sus compañeros de trabajo necesitan una gran inversión de tiempo para comprender el trabajo de esa persona, ¡esto amenaza la continuidad de la empresa!". Mi jefe llama a esto el Factor Bus .
@PatrickRoberts Gracias por eso, lo agregué a la respuesta.
¡Esa es una respuesta fantástica! Recomiendo tener una pauta de que cada pieza de código aceptado primero debe ser entendida por al menos 2 desarrolladores. Puede ser un codificador y un revisor, o simplemente un par de programadores que lo escribieron juntos. Ahora mezcle los pares con la suficiente frecuencia y tendrá una buena convergencia en la forma en que codifica.
Excelente. Lo primero que pensé al leer el título de la pregunta fue "tienen razón". Por supuesto, eso es simplista, pero lo has cubierto bien. No, no somos albañiles, pero mucho de lo que hacemos es intercambiable, y los estándares son lo que hace que funcione.
Escribir código es un poco más difícil que cortar el cabello. Una mejor analogía podría ser diseñar un edificio. Un arquitecto se va, y el siguiente entra y termina. Si el primer arquitecto solo hubiera terminado de dibujar el 95% de las vigas de soporte, el segundo arquitecto tendría que notarlo. Puede que no sea obvio. Se requeriría mucha comunicación.
Quizás agregue un poco a la respuesta para indicar que la propiedad conjunta lleva tiempo. Si sus jefes quieren que usted tenga la propiedad conjunta, deben darle tiempo para que se unan. No se puede tener propiedad conjunta si todo el equipo está combatiendo incendios todo el tiempo. Se debe permitir que los miembros del equipo se reúnan solos sin la presencia o interferencia de la gerencia.
@PaulRowe Eso es básicamente lo que quiero decir cuando hablo de "compartir conocimientos". Voy a ver si puedo encontrar una manera de aclarar eso.
@superluminary, por eso es necesario tener un solo arquitecto que sea el responsable final del proyecto de principio a fin. Su ejemplo es muy apropiado, esas vigas que faltan podrían ser, literalmente, la diferencia entre hacer panqueques humanos o no. (¿Qué sucede si el subsistema de control de tracción tiene una excepción no controlada? Estoy seguro de que me alegro de que ninguno de mis programas pueda tener el riesgo de matar directamente a alguien)
@superluminary no subestimes el entrenamiento y la habilidad necesarios para hacer un corte de cabello avanzado.
¿En serio? ¿Comparas el corte de cabello o los peluqueros con la CODIFICACIÓN? No hay una lógica intrínseca para cortar el cabello, eso es una comparación ridícula.
@lambdapool No estoy haciendo una comparación literal entre los dos ni afirmando que los dos son iguales. Simplemente estoy haciendo una abstracción para ilustrar mi punto, que es que dos compañeros de trabajo con las mismas habilidades básicas deberían poder terminar el trabajo del otro y que el proceso de desarrollo debería establecer las cosas necesarias para que eso sea posible. No tomes todo literalmente. Cualquier analogía se derrumbará si la miras de cierta manera, eso no disminuye su valor como herramienta para mirar un problema desde una perspectiva diferente.
@superluminary Creo que la comparación es mejor con los médicos: si bien todos conocemos los conceptos básicos, después de un cierto nivel de experiencia nos especializamos, por lo que, como un urólogo, no sabrá tanto sobre el cerebro como un neurólogo, podría ser un DB especialista con habilidades limitadas en javascript del lado del cliente.
Yo diría que los diferentes estilos causan un gran dolor. Si trata el desarrollo de software como ingeniería, no debería haber mucho lugar para la subjetividad. La decisión es correcta o incorrecta en un contexto dado. Al menos, la revisión de código es una buena herramienta para discutir algunos enfoques discutibles. Es muy difícil recordar la situación en la que no podía entender CÓMO funciona el código. Por lo general, es mucho más difícil entender POR QUÉ el código funciona de esa manera. Ya sea una característica o un error. PD Buena charla sobre el estilo del código: vimeo.com/97329157

La propiedad colectiva del código es una cosa dentro del desarrollo Agile y generalmente se considera una buena cosa. Pero parece que su(s) jefe(s) simplemente tomaron una cosa que les gusta del manifiesto ágil que les queda bien e ignoraron todas las demás.

Para que esto funcione, debe tener un equipo que trabaje en conjunto y se comunique con frecuencia. La mayoría de las tareas deben resolverse mediante programación en pares, las revisiones de código deben ser comunes y tempranas, debe haber un alto grado de pruebas para inspirar confianza en la calidad, preferiblemente se desarrolla utilizando el desarrollo basado en pruebas, etc., etc.

Que haya un estándar de código común ni siquiera es algo ágil, es solo sentido común.

+1. Creo que el OP está tratando de resolver el problema equivocado: está bastante claro que no hay comunicación dentro de los desarrolladores o entre ellos y la administración. Un gerente siempre debe poder pedirle a otra persona que recoja a un desarrollador de vacaciones; por lo que necesitan organizar (y hacer cumplir si es necesario) el intercambio de conocimientos.
Estoy de acuerdo con los dos. Las prácticas esperadas son buenas y están tratando de empujarte a usar estas metodologías, ahora es necesario que ocurra el cambio de mentalidad. El equipo necesita encontrar una manera de compartir este conocimiento mediante revisiones de código, revisiones de diseño, programación en pares y, en general, hablar entre ellos.
@SigalShaharabani Probablemente más importante que " El equipo necesita... " es " La administración debe permitir que el equipo... " y aceptar que habrá un gran impacto en la productividad mientras esto sucede.
@TripHound Bueno... en realidad no. A la gerencia no le importa y nunca le importará, así son las cosas. El desarrollo es responsabilidad de los desarrolladores, es su trabajo diario. La clave es seguir entregando mientras realiza esos cambios: aprenda de la experiencia de compañías como Netscape/Mozilla. Y no trate las "revisiones de código, la programación en pares..." como algo separado del desarrollo de ninguna manera. Si las pruebas no son verdes, el código no está listo. Si la compilación no se ejecuta, el código no está listo. Si el código no se revisó, no está listo. Te hará la vida mucho más fácil :)
@TripeHound No solo permitir, sino alentar y facilitar el intercambio; parece que en este momento, los codificadores en esta tarea simplemente hacen lo que 'sienten' que es correcto, y no se acercan entre sí para pedir consejo o compartir ninguno de sus planificación, no porque sientan que no mejoraría su productividad, sino porque solo están siendo recompensados ​​por los resultados finales. Los codificadores pueden intensificar y hacer más si así lo desean, pero es trabajo de la gerencia fomentar ese tipo de comportamiento.
@Zibbobz (y @Luaan) Son ambos: los desarrolladores deben querer hacer un cambio, idealmente dirigido por alguien que sabe cómo hacer ese cambio (no es lo mismo que alguien que conoce el destino); la gerencia debe alentar este cambio y ser consciente/aceptar que durante dicho cambio la productividad probablemente caerá.
¿Alguien realmente programa en pareja o es solo algo que usamos como ejemplo de una buena práctica?
@djechlin Lo hago, a veces. Principalmente cuando los graduados/jóvenes se unen a mi equipo, para ponerlos al día, enseñarles buenas prácticas y compartir conocimientos profundos.
@djechlin Sí, actualmente trabajo en un equipo muy ágil en el que emparejamos el programa y hacemos revisiones periódicas del código. Realmente mejora la calidad y más conocimiento compartido. Pero sí hace falta un equipo Y una dirección que lo permita y fomente.
La propiedad colectiva es algo bueno, pero si el código es algo más que trivial, llevará un tiempo cargarlo en la cabeza. Si estamos tratando con la arquitectura, quizás nos tome uno o dos días entenderla realmente.
@superluminary, por eso tiene sentido dividir las cosas en subsistemas de buen tamaño y dejar que las personas trabajen en cada subsistema... individualmente. Es probable que cada subsistema no sea diferente para los hombres de Marte y las mujeres de Venus. Las revisiones de código/revisiones de arquitectura deben garantizar que nadie construya sus propias islas especiales de dolor en forma de copos de nieve.
@ChrisMarisic: no me encontrarás en desacuerdo con eso. Todavía se necesita una gran cantidad de comunicación para transmitir la información sobre lo que se ha completado en ese subsistema y lo que no. ¿Qué excepciones puede lanzar? ¿Cómo tratamos los estados de error? ¿Qué pasa si la red se cae durante una actualización? ¿Qué pruebas están escritas? ¿Qué pruebas deben escribirse? La comunicación es una parte vital de un equipo ágil, pero parece que falta aquí.
@superluminary algunas personas mucho más sabias que yo describieron las respuestas a esas preguntas como el nivel de madurez de una organización. Tener respuestas claras y definidas a esas preguntas muestra un compromiso con los detalles y la documentación, es información realmente importante a diferencia de más de la mitad de los "documentos" que se derivan de un proyecto de software.

Creo que el problema es tuyo y no de tus jefes.

diferentes personas tienen diferentes formas de hacer las cosas

Debe detener eso ahora mismo, establecer estándares de codificación, comenzar a trabajar con diseños y convertirse en intercambiables.

Cuando uno de mis compañeros de trabajo se va de vacaciones, obtenemos un documento de lo que está trabajando, cuál es ese progreso y cuáles son los temas pendientes y, lo más importante, dónde está la documentación.

Creo que el meollo del problema es que deberías empezar a trabajar más en equipo.

Y si no puede llegar allí como compañeros de trabajo, es el trabajo de la gerencia hacer que eso suceda, se les paga por eso.

¿Cómo es esto un problema con OP y no con los gerentes? OP debería poder adoptar diferentes estándares de codificación, pero ¿debería seguir los estándares que usa bob o los que usa bill?
@Taemyr Bob, Bill y el OP deberían reunirse y ponerse de acuerdo sobre los estándares de codificación. El trabajo de los gerentes es hacer que ese proceso suceda si Bob, Bill y el OP no pueden hacerlo.
+1 para "establecer estándares de codificación, comenzar a trabajar con diseños". La propiedad compartida del código es un estándar. Solo es un problema cuando los programadores hablan "diferentes idiomas"
"Creo que el corazón del problema es que deberías empezar a trabajar más en equipo". => REALMENTE necesitamos un botón "+100" para oraciones individuales en este foro.
Nunca he trabajado en un equipo que no haya liderado donde a nadie más que a mí le importe un poco codificar de la misma manera. ¿Cómo sugiere que el OP haga que todos estén de acuerdo y sigan los estándares de codificación, suponiendo que él / ella no sea el líder del equipo?
@AmyBlankenship Por eso dije que es un trabajo de administración. Una cosa que me gustaría para los programadores es que tomaran una o dos clases de economía. Hará que la comunicación con la gerencia sea mucho más fácil. Lo que debe hacer es poder explicarle a la gerencia (en su idioma sin emocionarse) cuánto cuesta que cada uno haga lo suyo.
¿En qué parte de su respuesta dice que es un trabajo de administración hacer que los programadores establezcan estándares de codificación, trabajen con diseños y se vuelvan intercambiables? Tal vez deberías editarlo para que se destaque.
@AmyBlankenship, la última parte de mi publicación fue: "Ahora hay un trabajo que su gerencia debe hacer". Quería decir eso, edité la publicación y aclaré. Y no quiero decir que la gerencia deba establecer estándares de codificación, sino hacer que un equipo trabaje como un equipo.
Dijiste, "obtenemos un documento... (diciendo) dónde está la documentación". JAJAJA. ¿Qué pasa si no pueden encontrarlo?
IME, no podrá obtener la aceptación de los otros programadores para establecer estándares, etc., sin un fuerte apoyo de la gerencia. Una persona que no sea líder del equipo no podrá implementar su respuesta. Tengo la sensación de que su equipo ya estaba haciendo las cosas que describió cuando se unió y no ha visto un equipo en el que no hayan terminado o participado en su implementación.
Al principio, cuando estaba leyendo, pensé que el OP decía que las personas usaban diferentes lenguajes de programación, por eso parecía tan caótico. Pero ahora que creo que es una cuestión de estilo de codificación, en realidad se trata de que los desarrolladores se reúnan, compartan conocimientos y establezcan las mejores prácticas. Estoy de acuerdo con esta respuesta.
¨I think the heart of the problem is that you should start working more as a team."Mira, eso es un problema de gestión. El corazón de este problema es que, si todo es como se describe, esta bien podría ser una de esas empresas que se deshace de los gerentes, porque estos tipos no están haciendo su trabajo.
Depende del CTO establecer estándares de codificación, y necesita revisiones de código y programación en pares para difundirlos en la organización. No es culpa de los desarrolladores si tales cosas no se han implementado.
@superluminary CTO probablemente no se preocupe por los estándares de codificación, demasiado minucioso de un detalle. Si se trata de una empresa pequeña con solo un par de equipos de desarrollo, podría depender del CTO. Generalmente dependería de la persona responsable de varios equipos de desarrolladores. La próxima generación de mayor tamaño simplemente no puede preocuparse por ese bajo nivel de detalle, se preocuparán por la interoperabilidad en toda la empresa, no por las líneas de código individuales.
Un buen desarrollador de software traerá soluciones al equipo y llenará los vacíos en los métodos de gestión. El desarrollador de OP no está desempeñando el papel de experto profesional en su campo. En cambio, culpa a la gerencia por no conocer sus limitaciones. ... él es quien debe reconocer la limitación del equipo y del software y darse cuenta de que no está cumpliendo con los objetivos de la gerencia y trabajar con otros profesionales para establecer expectativas realistas y objetivos de desarrollo técnico para que el equipo y la gerencia lleguen al mismo lugar .

La propiedad colectiva del código, en la que cada programador puede trabajar igualmente bien en cada parte del software, es un ideal al que se debe aspirar (porque los beneficios son reales), pero se necesita mucho trabajo para alcanzarlo.

El equipo necesita hacer cumplir un estilo de programación para que el código sea inmediatamente reconocible para todos. El equipo debe realizar revisiones estrictas del código para que el conocimiento de una parte del código se comparta tan pronto como se escriba y se garantice el estándar común de calidad. Debe usar una "definición de hecho" que asegure que nada se llame "hecho" hasta que se documente, pruebe y revise. Los nuevos miembros del equipo necesitan tiempo y capacitación para ponerse al día con todas las tecnologías utilizadas.

Si los gerentes exigen los resultados de tal proceso sin invertir primero en implementarlo, están siendo poco realistas.

Creo que debería discutir con sus colegas qué tipo de cambios le gustaría hacer en su flujo de trabajo para que esto sea más posible, como comenzar con revisiones de código o programación en pares, o acordar un estilo de codificación común.

Luego , diríjase a sus gerentes y diga algo como

Sé que le gustaría que todos los programadores fueran intercambiables, para que todos podamos trabajar en cualquier problema que pueda surgir. Sin embargo, aún no hemos llegado a ese punto: todos sabemos manejar solo una parte del código base, y es difícil adaptarse a la forma de trabajar de otras personas. Sin embargo, creemos que es una buena idea, y proponemos implementar X e Y para comenzar a trabajar hacia ese objetivo.

Creo que esta respuesta se mejoraría al enumerar los pasos para que el OP obtenga el tipo de aceptación necesaria para hacer ese último párrafo. Por lo general, un programador de IME se preocupa por este tipo de problemas y el resto no quiere que nadie más les diga cómo codificar.
@AmyBlankenship: Estoy de acuerdo en que a un programador le importa, pero no puedo agregar una respuesta a ese problema (ya que aún no he descubierto cómo hacerlo, como programador en el equipo...) y creo que sería ir demasiado lejos más allá de la pregunta formulada. De todos modos, necesita convencer a la gerencia de que las cosas pueden cambiar si la gerencia comienza a impulsar el cambio. Como solo un miembro del equipo con una administración a la que no le importa, según mi experiencia, no puedes hacer lo suficiente.
El argumento del "estilo de código" está exagerado. Un estilo compartido puede resolver algunos problemas del equipo, pero no resuelve el problema de fondo. Una guía de estilo es útil porque los desarrolladores no conocen el código. Los desarrolladores necesitan practicar la lectura de otro código para aprender a leer y escribir. ... Una persona que solo puede leer sus propios documentos en inglés no tiene conocimientos de inglés y un desarrollador que no puede leer el código de otros desarrolladores es igualmente analfabeto. ...Si esto es así, no se amargue, en su lugar, descargue y reescriba un importante proyecto de código abierto mensualmente durante 4-6 meses. Se sorprenderá de lo fácil que se vuelve el código de lectura.
@Nathaniel: Estoy pensando en mi estimado colega que escribe funciones de más de 800 líneas, que encuentro ilegibles y que él considera una cuestión de gusto. No entiende mis clases con muchos métodos pequeños. Por supuesto, nuestras habilidades de lectura de códigos siempre se pueden mejorar, pero preferiría tener algún tipo de acuerdo al respecto. Por supuesto, poner énfasis en las pruebas también resolvería eso (no puede realizar pruebas unitarias de sus funciones).
Si alguien está usando métodos para practicar la programación de procedimientos en un lenguaje OO, deben corregirse. Hay mucha documentación para cada idioma que muestra el uso adecuado de los métodos. Un método solo debe realizar el trabajo descrito por el nombre del método. Por ejemplo, si llaman a su método DoAllTasksAssociatedWithTheCreationOfANewUserAndUserProfile, entonces puede ser grande, pero debería poder consumirlo de la misma manera. Se podría señalar que tiene 2 preocupaciones. Por otro lado, si solo dice SaveUser y hace muchas otras cosas, deben aceptar.

Me parece que los desarrolladores y los gerentes han tomado posiciones totalmente opuestas en el espectro que va desde la propiedad individual del código hasta la responsabilidad conjunta.

Los desarrolladores podrían hacer más para acercarse al ideal de los gerentes:

  • Normas de codificación. No debería ser un caos porque diferentes personas tienen diferentes formas de hacer las cosas.
  • Considere la programación en pareja. De esa manera, al menos dos personas entienden cada cambio.
  • Adquiera el hábito de buscar las causas fundamentales, no aplicar parches sobre parches. Creo que los programadores más experimentados han tenido que rastrear errores en código que no escribieron. Se necesita tiempo y esfuerzo para hacerlo bien.
  • Documento, revisión, documento, revisión.... El diseño en el que la persona había estado trabajando durante un mes debería haber sido redactado y entendido por varias personas.

Es posible que no pueda llegar hasta la flexibilidad extrema que desean los gerentes, pero debería poder ir mucho más allá de que solo haya una persona que pueda trabajar en cada pieza de código. Es posible que a veces necesite decirles "Joe o Nancy podrían hacerlo más rápido" y dejar que ellos decidan si pagan el costo de que otra persona lo recoja.

De acuerdo en todos los puntos, excepto que prefiero ver buenos nombres ( httpResponseDataen lugar de data, por ejemplo) y pruebas (funcionales y simples) que documentación. Este último es subjetivo y se garantiza que está incompleto (de lo contrario, sería código).
@ l0b0 Estoy de acuerdo contigo con respecto al código. Lamento diferir en cosas como las configuraciones especializadas necesarias, las herramientas especializadas, las diferencias entre los internos y los estándares y otras cosas difíciles de saber al leer el código y el conocimiento típicamente tribal.
@l0b0 El código es mucho más difícil de leer si las interfaces no están documentadas a fondo. A veces tuve que sumergirme en varias capas de profundidad solo para responder una pregunta simple como "¿Se permite que este puntero sea nulo?".

Respuesta corta: señala lo ridículo que es.

De hecho, me he encontrado con esto antes, y simplemente dije algo como:

¿Irías a un podólogo si necesitaras una cirugía cerebral? Ambos son médicos, ¿verdad?

O

¿Vas a un sastre para que te corte el pelo, porque los sastres usan tijeras como los peluqueros?

Luego señale que hay conjuntos de habilidades muy diferentes asociados con cada especialización. Dígales que la programación es la misma. Algunos desarrolladores son muy hábiles en un área, pero no tienen ni idea de otra.

No quiere decir que no puedas aprender las otras habilidades, pero tomaría tiempo y la voluntad de querer hacerlo.

El cruce de habilidades puede ser realmente bueno para la continuidad del negocio. En mi oficina, soy el único desarrollador de .net y tenemos mucho C# dando vueltas. Si me atropella un autobús, me golpean.
@Gusdor Ver mi comentario anterior. Nadie niega la necesidad de la redundancia de recursos y el intercambio de conocimientos. Sin embargo, no entrega las llaves de un sistema a alguien que no tenga las habilidades o la experiencia adecuadas.
No creo que esta respuesta se aplique aquí, porque el OP no menciona un conjunto de habilidades diferente. Se trata de la propiedad del código.
Es bueno si alguien más señala que es ridículo. Estaba administrando al vendedor de una caldera industrial de $ 1000000. Tuvimos una gran discusión con ellos sobre la filosofía de control, lo que resultó en la reprogramación del BMS (sistema de gestión de quemadores) en el sitio. Cuando los documentos revisados ​​llegaron a través de los chicos de instrumentación del sitio, le pidieron al chico de la oficina que los revisara. Su primera pregunta: "¿Qué es un BMS?" Se sintió aliviado por mi respuesta a su jefe: no aceptaré la firma de Paul en estos documentos ya que no participó en las acaloradas discusiones sobre la filosofía de control ni su implementación en el BMS en el sitio.
@Chris Mi respuesta aún se aplica si se esperaba que seleccionara un sistema grande y complejo de otro equipo con el que no tenía experiencia. Puede comprender las herramientas y el lenguaje de desarrollo, pero no necesariamente tiene el conocimiento del dominio ni cómo el equipo lo diseñó e implementó. Sí, la documentación, pero si se le asigna la tarea de reparar el sistema de otra persona porque está dañado durante la producción, incluso el desarrollador más experimentado tardará en hacerlo.
Si va a ir al podólogo pero está enfermo, espera que el podólogo de reemplazo obtenga su expediente y continúe donde lo dejó el otro.
@PieterB Cierto. ¡Sin embargo, esperaría que sea un podólogo!
@JaneS, bueno, si tiene una tienda con desarrolladores de C # y desarrolladores de php, la gerencia debe entender que esos no son conjuntos de habilidades intercambiables, pero espero que los desarrolladores de C # se hagan cargo del trabajo de los demás.
@JaneS: Están en el mismo equipo.
@Chris Si están en el mismo equipo y tienen conjuntos de habilidades compatibles, entonces estoy absolutamente de acuerdo contigo y mi respuesta no se aplica. Sin embargo, el OP implica que hay un diferencial de habilidades (al menos para mí), por lo que respondí como lo hice.
Vea arriba, compare manzanas con manzanas, no con plátanos
También depende del contexto, si estoy acostado teniendo un ataque al corazón, llevaría a un proctólogo si fuera el único médico disponible.
Esta sugerencia parece simplista y sarcástica y es poco probable que le gane al OP algún favor con sus jefes. Señalar los problemas en términos concretos (por ejemplo, con referencia a cualquier literatura sobre la productividad de los programadores) y ofrecer algunas sugerencias sobre cómo mejorar las cosas (por ejemplo, estándares de codificación comunes acordados) podría ser más constructivo.
Estoy de acuerdo en que es algo ridículo. Se necesita tiempo para volver a comprender incluso el propio código después de no verlo durante un tiempo, por lo que ciertamente se necesitaría tiempo para comprender el código de otra persona. Y, solo puedes acumular tanto en tu cabeza: aprender las cosas de otras personas no durará mucho. Hay un límite práctico para compartir la responsabilidad del código.
@PieterB "espera que el podólogo de reemplazo obtenga su expediente y continúe donde lo dejó el otro". Quiero vivir donde estés. Mi experiencia con médicos de cualquier tipo es que ya es bastante difícil lograr que el mismo médico continúe donde lo dejó.
La "falta de voluntad" generalmente debería conducir a la "falta de trabajo"

Tu escribiste,

nadie es dueño de nada, y nadie es responsable de nada tampoco. O, en otras palabras, todos son dueños de todo y todos son responsables de todo.

Esos son dos extremos (quizás deberías buscar un punto medio entre los dos extremos), y una falsa dicotomía.

¿Es esto común para la compañía de software?

Dependiendo del número de programadores hay varias posibilidades.

Una es asignar un equipo (de varios) a cada componente. Espere que todos los miembros del equipo sean responsables (si es necesario) de (cualquier cosa dentro) de todo el componente. Un equipo puede o no tener un único desarrollador jefe o líder de equipo, que también puede ser o no el punto de contacto oficial del equipo con el mundo exterior (administración y control de calidad).

Un mínimo que recomiendo son las revisiones de código. Cada persona es responsable de su propio desarrollo y tarda días en codificar alguna característica nueva, y luego una o más personas dedican horas a revisar lo que se ha terminado, probado y registrado. Los revisores de código pueden sugerir cambios y pueden razonablemente esperar (por parte de la gerencia) haber entendido lo que revisaron. Por ejemplo, un comentario de revisión (antes de que acepten o 'firmen' el cambio) podría ser: "No entiendo esto, será mejor que lo reelabores un poco y/o lo expliques mejor", o "¿Qué significa esto?" hacer, cuál es la función (por ejemplo, visible en la especificación funcional) que está implementando, dónde está la prueba de regresión funcional automatizada que probará esto").

Después de (si) aprueban un cambio, es razonable que un gerente venga y diga: "Mire, Bob está de vacaciones y/o ha dejado la empresa; creemos que hay un problema con este módulo que revisó y/o desea agregarle una nueva función. ¿Podría echarle un vistazo? Ya está familiarizado con (sin mencionar que es responsable de él), ya que revisó el código cuando se implementó".

Las revisiones de código tienen muchos propósitos, entre ellos:

  • Capacitación cruzada sobre qué hacen los componentes y cómo se implementan
  • Garantizar estándares comunes/coherentes (de codificación, documentación y/o pruebas)
  • Control de calidad (es decir, pruebas de "caja blanca", en busca de posibles errores)
+1 por su desglose del proceso de revisión de código, en lugar de simplemente decir "hacer revisiones de código".
Acordado. El equilibrio en Agile es que los desarrolladores deben tener áreas de experiencia y áreas de responsabilidad, pero que deben formarse orgánicamente. En Agile Ownership no se trata de una instalación militar segura donde nadie entra ni sale. Es un espacio compartido como un parque y el guardaparque se encarga de evitar su destrucción y trabajar con voluntarios para mejorar el espacio para todos.
@Nathaniel ¿Usa "ágil" equipos y/o líderes de equipo asignados a los componentes? Por ejemplo, una vez tuve un trabajo en el que era el más senior y "desarrollador jefe" con (eventualmente) otros 20 o 30 desarrolladores: otras personas hicieron sus cosas (se les asignó la responsabilidad de desarrollar componentes específicos) pero esperaba en un apuro (por ejemplo, si renuncian) para poder hacerse cargo o reasignar el mantenimiento de su código.
20-30 desarrolladores es demasiado para un equipo ágil. Generalmente, cuando un equipo se vuelve tan grande, algo serio está mal. Ver propiedad de código débil: martinfowler.com/bliki/CodeOwnership.html

Una vez, un chico se había estado preparando para un nuevo módulo durante más de un mes, luego se tomó unas vacaciones y, justo antes de irse, le dijo a nuestro jefe que todos los problemas se habían solucionado y que estaba listo para comenzar a codificar. Entonces, en el scrum del día siguiente, mi jefe me dijo, tenemos que terminar esto la próxima semana, ¿puedes recogerlo, por favor?

Ahí tienes a un gerente que se le cayó el cerebro.

Sí, para cada desarrollador debe haber al menos otro con el que esté trabajando íntimamente (programación en pareja y cosas por el estilo) en cada tarea individual (incluida la elaboración del diseño de un nuevo módulo), que debería poder hacerse cargo sin indebidas volver a trabajar en cualquier momento.

Pero eso no es lo mismo que decir que no hay gastos generales para cambiar a la mitad del vuelo:
debería ser aproximadamente el mismo gasto general, o idealmente un poco menos, como si el desarrollador original abandonara esa tarea sin atar cabos sueltos para manejar alguna emergencia, y luego Tuve que volver a subir después de una semana de trabajar en otra cosa.

Ahora, si usted no es con quien trabajó en esa tarea, solo tiene sus notas, y por muy buenas que sean (lo que probablemente no sea estelar, o considerando su descripción más como muy irregular o inexistente), simplemente no puede abarcar todos los detalles que su compañero de trabajo resolvió en ese mes.

Es como ir al hospital y tomarse el tiempo para que un médico evalúe cuidadosamente su condición durante un mes con controles repetidos, muestras de sangre, electrocardiogramas, radiografías y cualquier otra cosa que parezca útil, y luego ir al cirujano para que lo trate de inmediato, nunca dejando que los dos comuniquen algo útil.


Si no es usted con quien trabajó, debe señalar qué compañero de trabajo lo hizo y también advertirle que , aunque a él le resultaría mucho más fácil hacerse cargo que a usted, todavía hay un costo considerable, ya que él no estaba t el que hace la preparación él mismo .

Si no hay nadie más familiarizado íntimamente con esa preparación, debe mencionar que debería haberla y (dependiendo de cómo se documentó la investigación), que podría necesitar entre x% (su mejor estimación en cuanto a la documentación y lo que escuchaste) al tiempo completo de comenzar desde cero.


Al final, parece ser una falla de gestión:
el líder del equipo tiene que reunirse con los otros desarrolladores y elaborar un estándar de codificación, además de comenzar a hacer programación en pares, pruebas unitarias y revisiones de código. y todas las demás actividades para asegurar la calidad y difundir el conocimiento en el equipo.

¿Es común? No mucho. Pero se puede configurar para que funcione.

La idea más allá es evitar a las personas como puntos únicos de falla . Por supuesto, tiene un costo y los programadores pagan el costo. Es por eso que su jefe será difícil de convencer de que es una mala idea. Él tiene todas las ventajas y tú todos los inconvenientes. Aún así, tiene sentido.

Tiene sentido que pases tiempo con otros programadores para intercambiar conocimientos y prácticas. Esto se puede hacer mediante revisiones, programación en pareja o cualquier otra cosa que funcione para usted. He estado en un equipo de 22 donde un consultor (allí desde hace años) pasaba la mayor parte de su tiempo deambulando por los pasillos en lugar de programar. Era el aglutinante del equipo, y al menos 15 personas del equipo podían trabajar en los programas que hice. Puede ser cualquier otra cosa que se adapte a la necesidad, discusiones informales, intercambio de conocimientos en máquinas de café...

Pero tiene un costo. Vale la pena pagar en mi humilde opinión, pero si todos trabajan con la misma tecnología, no será demasiado costoso. El costo es una gran sobrecarga de comunicaciones. Eso es más lo que le comunicarás a tu jefe, ya que su idea no es mala en sí misma. Simplemente, tiene que entender que es una inversión con recompensas no inmediatas.

La justificación que tienen es que, cuando todos son responsables de todo, cuando alguien se va de vacaciones, otros pueden/deben simplemente intercambiar y cubrirlo, para que pueda disfrutar de las vacaciones en cualquier momento.

Conozco una empresa ( Menlo Innovations ) que hace rotar a "todos" en torno a "todos" los proyectos en un horario establecido. Hay una manera de hacer que funcione.

La gerencia se ha fijado esto como meta, pero ha renunciado por completo a la responsabilidad de hacer lo necesario para que funcione. Será necesario contratar a más personas junto con cronogramas de entrega más largos. Pueden justificar esto demostrando resultados a largo plazo y no siendo rehenes de algún gurú que piensa que es la única persona en el planeta capaz de codificar su proyecto en particular.

El verdadero problema con esto es tratar de implementar alguna práctica de forma aislada. Deberían haber considerado prácticas complementarias como: desarrollo de equipos, pruebas, documentación más extensa, reuniones diarias para compartir y poner a todos al tanto de lo que están haciendo los demás.

Por alguna razón, el editenlace está deshabilitado. La empresa es Menlo Innovations y la url es menloinnovations.com
@Dancrumb: corregí la ortografía de las innovaciones. La URL era correcta.
Debo señalar que muy pocas organizaciones necesitan reuniones diarias. Varios por semana, seguro. Pero, ¿qué pasó con el standup del viernes y el lunes por la mañana? bupkis. (a menos que te guste trazar tareas a nivel de hora, tendrías mi simpatía)
@ChrisMarisic: Entonces, en una reunión de pie el lunes por la mañana, ¿vas a decir el viernes, no hice nada, nada más ha cambiado, así que solo voy a hacer hoy lo que dije que iba a hacer el viernes?
@JeffO, en su mayor parte, todas las reuniones en las que he estado dicen "Estoy trabajando en lo que dije hoy, hace X días" y tal vez una o dos veces por semana una persona dice "Terminé Y, pasé a Z" que sería visible en cualquier indicador de estado accesible (tablero kanban, trabajo atrasado, etc.). El único otro tipo de reuniones de pie en las que he estado se convierten en reuniones completas con personas de pie durante 30 a 75 minutos discutiendo algo que la mitad del equipo probablemente discutió en minutos.
@ChrisMarisic: ¿Nadie tiene problemas con el diseño general, un marco en particular o algo más? ¿Está abordando todo esto en el correo electrónico o en otras conversaciones? Esas interrupciones deben posponerse hasta la reunión diaria. De lo contrario, si su proyecto funciona sin problemas, entonces no necesita una reunión diaria.

Creo que la siguiente es una conclusión bien equilibrada, desafortunadamente a alguien simplemente no le gusta escucharla. He recibido repetidas solicitudes para eliminarlos. En un mundo democrático, todas las voces merecen ser escuchadas. No te gusta escuchar que es una cosa, pero tratar de silenciarme es otra cosa, lo cual no es muy bueno en mi opinión. Así que aquí está de nuevo, mi conclusión, eliminado de mi OP.

Conclusión

Creo que es hora de que detengamos la discusión y pasemos de esto ahora. Después de una revisión cuidadosa, elegí la única "respuesta constructiva que sugiere una solución constructiva" como respuesta. Pero, de hecho, todas las respuestas son muy buenas, me gustaría poder elegir más de una como respuesta.

Por las respuestas me di cuenta que es un tema bastante controvertido, eso me abre los ojos, porque antes pensaba que mis jefes no tienen ni idea. Ahora me doy cuenta de que antes no tenía ni idea.

Como dijo Patricia Shanahan, "los desarrolladores y los gerentes han tomado posiciones muy opuestas en el espectro, desde la propiedad individual del código hasta la responsabilidad conjunta" , y puedo decir claramente qué respuestas/comentarios son de los gerentes:

  • "Un gerente siempre debe poder pedirle a otra persona que recoja a un desarrollador de vacaciones"
  • "Creo que el corazón del problema es que deberías empezar a trabajar más en equipo".
  • "Lo que tienes que hacer es no involucrar a tu jefe"
  • "El equipo necesita encontrar una manera de compartir este conocimiento mediante revisiones de código, revisiones de diseño, programación en pares y, en general, hablar entre ellos".

Antes de llegar a tal conclusión, considere nuevamente el siguiente hecho, ese tipo lo preparó durante más de un mes, pero nunca compartió su hallazgo con nadie más, y ahora mi PM quiere que lo recoja sin ningún conocimiento previo y lo termine. dentro de una semana Y además, el hecho de que, para enviar la solicitud de vacaciones, necesitamos al menos un mes y, con mayor frecuencia, la presentamos dos o tres meses antes de las vacaciones. A partir de esto, creo que todos sabrían dónde está realmente el problema. Estoy totalmente de acuerdo con TripeHound,

Probablemente más importante que "El equipo necesita..." es "La gerencia necesita permitir que el equipo..." y aceptar que habrá un gran impacto en la productividad mientras esto sucede.

Admítalo o no, el problema real ha sido señalado por gazzz0x2z: "Viene con un costo, y los programadores pagan el costo. Es por eso que su jefe será difícil de convencer de que es una mala idea. Él tiene todas las ventajas, y usted todos los inconvenientes" , y personalmente estoy de acuerdo con RemcoGerlich, "si los gerentes exigen los resultados de tal proceso sin invertir primero en implementarlo, están siendo poco realistas" , porque después de todo, como lo expresó no comprende, "se necesita tiempo para volver a comprender incluso el propio código después de no verlo durante un tiempo, por lo que sin duda llevará tiempo comprender el de otra persona.Hay un límite práctico para compartir la responsabilidad del código" ."Sería bueno que todo el equipo directivo pudiera intercambiar puestos de trabajo también" .

Ok, sé que lo he llevado demasiado lejos, y la mayoría de los gerentes aquí podrían no estar de acuerdo conmigo. Entonces, permítanme enfatizar, estos son mis propios puntos de vista personales, y terminemos la discusión y sigamos adelante. Esa es también la razón principal por la que elijo la única "respuesta constructiva que sugiere una solución constructiva" como respuesta: los gerentes y los desarrolladores deben entenderse mejor entre sí y, en la mayoría de los casos, son los gerentes los que necesitan comprender mejor a los desarrolladores. Con tal comprensión y la solución constructiva, estaremos allí, pero no sucederá de la noche a la mañana.

Estoy en esta compañía de software, y lo gracioso es que solo he tenido dos gerentes hasta ahora, pero estos dos gerentes ven los trabajos de programación no muy diferentes a poner ladrillos. Siempre enfatizaron, ustedes deben asumir los trabajos de los demás en cualquier momento.

Esa es una noción completamente ridícula. La programación es un campo altamente especializado y los diferentes aspectos de la programación requieren conjuntos de habilidades muy diferentes. Lo mejor que puedes hacer es señalarles eso. Si bien las analogías con otras profesiones pueden ser puntiagudas y adecuadas (corte de cabello a medida, etc.), es posible que sus jefes no les crean, así que señale algunas de las enormes diferencias en la programación, como cuán diferente es el diseño de la interfaz de usuario de las pruebas de rendimiento, por ejemplo.

Pero sí, definitivamente debería tratar de disipar esa noción de sus gerentes, para que no tengan un despertar muy duro cuando descubran cuán equivocados están.

No creo que esta respuesta se aplique aquí, porque el OP no menciona un conjunto de habilidades diferente. Se trata de la propiedad del código.
@Chris Sin embargo, la declaración general de los jefes se aplica aquí. "Programar trabajos no muy diferentes a poner ladrillos" es a lo que apunta esto.
No está claro si los directivos lo expresaron así, probablemente sea una frase del OP.
"diferentes aspectos de la programación requieren conjuntos de habilidades muy diferentes" es cierto, pero un desarrollador que tiene habilidades cruzadas (aunque solo sea hasta cierto punto) en los trabajos de otros miembros del equipo es mucho más apto para contratar que uno que insiste en nunca dejando su propia especialidad.
La tendencia actual es para desarrolladores de pila completa, por lo que parece esperarse que algunos desarrolladores, al menos, hayan dominado múltiples aspectos de la programación.
@Chris: ¿Se trata realmente solo de la propiedad del código o también del costo general de cambiar de tarea?
@Deduplicator: Sí, solo propiedad del código.

Puede estandarizar las convenciones de codificación, las herramientas, las carpetas y la forma de hacer las cosas. Pero no puede igualar el conocimiento sobre algunas funciones intrincadas y cómo funcionan algunas partes del código. Eso solo es propiedad de los que pasan horas pensando en eso. Explique a sus jefes que no es poner ladrillos en absoluto, tuve que lidiar con jefes ignorantes como estos, son del campo de la construcción y tratan de usar los mismos estándares en la industria del software, no puedo explicarles que esto conduce a grandes desastres. proyectos fallidos y alta rotación de muy buenos desarrolladores. Explícales eso. Cada pieza tiene su propia forma de trabajar y es específica para los requisitos comerciales. Por ejemplo, tiene un "ladrillo" que puede hacer una operación más, otra operación menos y dividir, algún día un tipo pedirá un cálculo de función derivada o matricial ¿puedes comparar ese "ladrillo" con el anterior? ¿El tipo que programó el nuevo cálculo matricial tiene tiempo para compartir su conocimiento y, al mismo tiempo, permanecer en horario? No me parece.