Últimamente me he encontrado en una situación difícil. He estado trabajando en un juego con un compañero de programación durante casi 8 meses. Ambos comenzamos como recién llegados a la programación alrededor de agosto del año pasado, él es un estudiante de CS de segundo año, soy un técnico de soporte de TI de oficio y soy un programador autodidacta con multitud de libros y suscripciones en línea.
El problema que he estado viendo constantemente es que a medida que escribimos un fragmento de código, a menudo será un poco pirateado, tendrá muchas fallas y, si es un concepto nuevo para uno de nosotros, lleno de soluciones ingenuas. Esto está bien, estamos aprendiendo, espero que ambos códigos sean un poco pirateados juntos en la primera o segunda pasada. El problema se presenta cuando se trata de corregir y refactorizar esos comportamientos pirateados.
Mi compañero se aferrará a su comportamiento recién improvisado, negándose descaradamente a ver cualquier error en el momento en que comience a funcionar. Reclamando casi la perfección de una pieza de estructura que ni siquiera puedo tratar de usar, incluso si tenía comentarios y métodos y campos con el nombre apropiado. No importa cuánto lo intente, simplemente no puedo lograr que vea los defectos evidentemente obvios que evitarán cualquier cambio adicional o expansión del comportamiento sin romperlo por completo y todo lo que está tan estrechamente relacionado podría estar en la misma clase. Las soluciones pirateadas permanecen permanentemente pirateadas, los diseños mal pensados permanecen como estaban cuando se concibieron y probaron por primera vez.
Paso tanto tiempo cuidando niños del nuevo código como lo escribo yo mismo, no sé qué hacer. Mi compañero lo perdió esta noche y dejó en claro que no importa qué, sin importar el punto de referencia, sin importar la práctica común, sin importar la prueba irrefutable, su código se mantendrá de la forma en que lo hizo por primera vez. Incluso si se han escrito libros completos sobre por qué desea evitar hacer algo, él se negará a reconocer su validez alegando que es solo la opinión de alguien.
Tengo un interés personal en nuestro proyecto, sin embargo, no estoy seguro de poder seguir trabajando con mi pareja. Parece que tengo tres opciones abiertas para mí.
- Deje de preocuparse por el funcionamiento de la base de código más allá del punto de compilación, y solo trate de tratar de mantener y analizar el comportamiento que apenas cojea. Esperando que una vez que las cosas comiencen a romperse seriamente, él lo verá e intentará hacer más que simplemente poner una venda sobre el diseño fundamentalmente defectuoso.
- Mantenga los argumentos interminables sobre los problemas que han sido resueltos hace una década por otras personas mucho más capaces.
- Deje de programar en este proyecto, abandonando casi 10,000 líneas de mi código e incontables horas esclavizándose por el diseño e intente encontrar un nuevo proyecto por mi cuenta.
¿Qué enfoque puedo tomar para determinar si vale la pena continuar con este proyecto con esta persona? ¿O qué factores deberían influir en mi decisión? Hemos escrito mucho código y no quiero renunciar a esto a menos que sea necesario.
fuente
Respuestas:
El código imperfecto enviado es mejor que el código perfecto en la pizarra que nunca se envía.
Habiendo dicho eso...
Yo consideraría lo siguiente.
Considere lo anterior, trate de pensar en el trabajo adicional requerido.
Debe determinar sus prioridades y determinar si los problemas relacionados con el trabajo con esta persona valen la pena. No podemos resolver esto por ti.
Sabes que no quieres trabajar con este tipo de persona.
Probablemente esté haciendo un proyecto como este porque quiere aprender a programar y encontrar elegancia en el oficio mismo.
fuente
Esto puede ser una cosa cultural. En algunas culturas, admitir que cometiste un error es algo inaudito, y pedirle a alguien que admita que cometió un error es lo más grosero que puedes hacer. Si es esa situación, huye.
En mi experiencia con personas muy inteligentes, si les dice que algo que están haciendo es menos que perfecto, (1) le darán una razón correcta y fácil de entender por qué lo que están haciendo es realmente correcto, (2) diga usted que saben que está mal, pero no tienen tiempo para arreglarlo debido a prioridades, o (3) gracias por señalarlo y solucionarlo.
Negarse a aprender es el peor atributo que podría tener un desarrollador de software. Déjalo a él. La vida es demasiado corta y preciosa para perder el tiempo con él.
fuente
Posiblemente, la forma más fácil es traer a alguien más al proyecto: o estás equivocado y su base de código es demasiado inteligente para ti, o tienes razón y es demasiado inteligente para todos. Pronto lo descubrirá y obtendrá una copia de seguridad si resulta ser basura, enrevesada, código de nivel de programador junior.
Por otro lado, un producto que funcione vale cualquier número de años de código claro, elegante y finamente ajustado. Haz el juego, envíalo, aléjate y deja que lo mantenga y no trabajes en v2.
fuente
Aquí hay algunas ideas, incluso si algunas de ellas son mutuamente excluyentes.
Responsabilidades de fuente separadas. Si trabajas en el Módulo A y él en el Módulo B, puedes competir con tus diferentes estilos. ¿Está lanzando funciones de trabajo a menudo? ¿Llega a un punto en el que necesita reescribir su código desde cero? Refactorice el código de sus módulos y no lo toque,
Déjelo hacer el mantenimiento de su peor código. Si lo hace con éxito, has evitado una tarea horrible. Si no puede, sentirá el dolor.
Considérelo desde el punto de vista de un usuario o negocio. En algunos casos, solo necesita un producto viable que Google o Microsoft puedan comprar. En otro caso, lanzará un producto al mercado y respaldar a miles de clientes con código defectuoso o pirateado será un infierno. No es lo mismo si su código controla aviones no tripulados con misiles nucleares o hace videos felices para adolescentes.
Él hace las clases, tú haces las pruebas. Refactorizar el código con pruebas es más fácil y seguro. De esta manera, no necesitará mirar dentro del código solo en la barra Junit. Esto supone que A) está programando pruebas, B) su código de colega es comprobable. Si le resulta difícil construir las pruebas durante la fase de codificación, esta última será peor.
Ir juntos a entrenamientos o eventos. Cuando no sepa que la forma correcta es bastante natural, use la única forma que sepa. Ver el código de otros podría no resolverlo todo, pero no está de más intentarlo.
Encuentra tus fortalezas complementarias. Refactorizar a veces puede ser divertido. Si él escribe cosas que al menos funcionan, entonces podrías hacer la refactorización. Puede hacer picos para explorar soluciones que no terminan en código de producción.
Es posible que no quiera volver a escribir el código, pero podría aceptar escribir mejor el nuevo código. Entiendo que reescribir es difícil, aburrido y puede romper cosas. Cultiva algunas islas de calidad. De esta manera tendrá buenos ejemplos de cómo hacer las cosas.
Usa la regla del boy scout . Deje las cosas intactas a menos que necesite trabajar en ello. Si un módulo está mal escrito pero funciona y no necesita cambiar, déjelo así. Si necesita corregir un error o completar una función, mejórela un poco. Después de algún tiempo, el 20% de las clases que cambias el 80% del tiempo mejorarán. Más islas de calidad.
No podemos sugerir cuál es la mejor solución sin conocerlos a ambos. Buena suerte.
fuente
Ok, aquí hay una respuesta que probablemente no te gustará.
Aquí está mi razonamiento. Probablemente estés tratando de ganar dinero. Para ganar dinero, debe enviar rápidamente las funciones completas. Nadie te va a pagar más por un juego de computadora 'bien codificado'.
La mayoría de las empresas tienen el mismo problema. Refactorice el código existente para hacerlo 'mejor', a veces incluso objetivamente mejor en términos de velocidad o confiabilidad O escriba nuevas características.
El 99% de las veces eligen escribir las nuevas características porque son el resultado de un simple análisis de costo-beneficio.
fuente
Me gustan todas las respuestas hasta ahora. Tomando uno de los puntos de la respuesta de Enderland :
Me gustaría aprovechar este tiempo para conectar el intercambio de pila de revisión de código . Es un lugar maravilloso donde los profesionales pueden criticar tu código. Y, sinceramente, muchas de las revisiones de códigos son de gran ayuda para los involucrados: los que preguntan, los que responden y los que se topan y las leen. Raramente obtienes reseñas tan útiles en un entorno profesional (que puede ser el caso en los lugares donde he trabajado por cualquier motivo).
Mi pequeño consejo es publicar parte de su código para su revisión. No sugeriría usarlo como munición para demostrar que este tipo está equivocado, dudo que lo tome en serio, pero puede obtener información muy útil tanto sobre el código que ha escrito como sobre el código que ha escrito. Recomiendo enviar los fragmentos de código por los que más pelean. Con toda probabilidad, ambos están equivocados hasta cierto punto y pueden usar la revisión como una forma de lograr que un tercero objetivo intervenga. Esto logrará algunas cosas:
Puedes desconectarte de la tensión emocional de la situación.
Obtiene asesoramiento profesional en tiempo real. Un gran impulso a lo que estás aprendiendo.
Alguien te dirá que te equivocas. Lo cual es bueno, porque cualquiera que programe por un período de tiempo va a escuchar esto. Puedes manejarlo mal como este chico con el que estás trabajando, o puedes aprender a lidiar con eso.
Creo que si usa las revisiones de código de la manera correcta, tiene mucho que ganar al tratar con esta persona extremadamente frustrante. Y es mucho más interactivo que un libro o sitio web que dice "haz esto, porque es la forma correcta la mayor parte del tiempo".
Del mismo modo, está el intercambio de pila de desarrolladores de juegos . No es tanto un lugar para publicar código para su revisión, sino para preguntar sobre conceptos / ideas con los que está luchando. Una vez más, ese lugar es de gran ayuda para todos los involucrados.
Es posible que haya visto estos dos sitios antes; Solo quería asegurarme de que sean parte de su conjunto de herramientas.
fuente
Suena bastante inútil. Probablemente me rendiría y seguiría adelante si me sintiera como tú; Definitivamente llega el momento de alejarse y usted puede estar allí.
Si aún no está listo para marcharse, necesita encontrar una manera de llegar a un mejor acuerdo sobre su proceso. Parece que tiene estándares de codificación, pero no estándares acordados. La próxima vez que te encuentres en una encrucijada, la próxima vez que quieras un mono con un poco de código y tu amigo quiera dejarlo solo, toma una conversación en las siguientes líneas:
Douglas: Quiero cambiarlo porque X, que está aquí en nuestras directrices.
amigo: Está bien como es.
Douglas: ¿Entonces estás diciendo que deberíamos cambiar las pautas?
amigo: No, creo que está bien como está.
Douglas: Entonces, ¿para qué sirven las pautas?
amigo: No sé, los escribiste.
Douglas: ¿Qué pautas escribirías?
amigo: no escribiría pautas. Es una pérdida de tiempo.
Douglas: ¿Entonces deberíamos tirar las pautas y escribir cualquier basura que estemos pensando en ese momento?
amigo: Esto no es una mierda.
Douglas: ¿Es perfecto? ¿Es ideal?
amigo: hace el trabajo; pasemos a la siguiente característica.
Douglas: ¿Hay algo en lo que podamos estar de acuerdo, que X es un buen código e Y es un mal código?
amigo: Déjame en paz; ¡Solo quiero codificar!
Bueno, eso no salió bien, ¿verdad? Creo que la sensación que tengo es que tú y Buddy quieren cosas diferentes. Si hay algo en lo que puedas estar de acuerdo, genial; comenzar desde allí y construir sobre él. Pero no puedes hacer que acepte querer lo que quieres, más de lo que podrías hacerte querer lo que parece querer. Si puede encontrar ese deseo común y llegar a un acuerdo común desde allí, tal vez puedan trabajar juntos.
Douglas: ¿Qué quieres?
amigo: solo quiero codificar.
Douglas: Yo también quiero codificar, pero quiero sentirme orgulloso de mi código.
amigo: estoy orgulloso de mi código.
Douglas: Aquí hay una función de la que estoy orgulloso: ¿qué opinas de ella?
amigo: Bueno, está bien, pero no deberías volver a calcular X dentro del bucle; Es ineficiente.
Douglas: ¿Entonces estás diciendo que siempre debemos calcular valores constantes fuera de los bucles?
amigo: Bueno, duh!
Douglas: ¿Crees que eso debería estar en nuestras pautas?
amigo: por supuesto.
douglas: OK, lo agregaré a nuestras pautas y actualizaré mi código ...
Douglas: ¿Cómo es ahora?
amigo: bien.
Ahora Buddy está contribuyendo a las pautas (aunque sea indirectamente), por lo que tiene un poco de sentido de propiedad. Tal vez, solo tal vez, comenzará a tomarlos más en serio. Creo que me inclinaría a borrar la pizarra y comenzar de nuevo con las pautas, dejando que la mayoría o todas ellas provengan de Buddy al principio. Siga adelante y escriba código de mierda para que sienta la necesidad de agregar a las pautas; deja que vengan de él. Tal vez entonces él comenzará a entender la razón de ellos.
Pero si prefieres darte por vencido y seguir adelante, esa tampoco sería una mala opción.
fuente
Suponiendo que decide abandonar el proyecto:
fuente
tl; dr deberías abandonar el proyecto.
Sin saber más sobre esto, entonces nos lo ha dicho, especularía que la fricción que está experimentando está relacionada con la experiencia.
A pesar de que no eres un programador de profesión como profesional de TI, probablemente hayas aprendido de la manera difícil hacer las cosas bien la primera vez, tu referencia a tu futuro yo indica que lo has jodido en el pasado y aprendido No a.
Su estudiante de CS de segundo año, incluso si es muy talentoso, probablemente carece de la perspectiva de haberlo hecho (si es como yo, repetidamente :).
Él / ella nunca creerá realmente en el valor de arreglar las cosas a medida que avanza hasta que tenga cicatrices de quemaduras por no hacerlo o sea asesorado en una cultura con una disciplina de ingeniería excepcional, o ambas.
Esta persona puede ser su compañero de programación, pero no es su compañero de proyecto, por lo que hacer este juego como un proyecto de compañero probablemente sea una causa perdida. A menos que esté preparado para comer el costo futuro. Quizás la relación sea lo suficientemente valiosa para ti. En ese caso, déle al dobladillo suficiente cuerda para ahorcarse e intervenga para ayudar a limpiar el desorden cuando esa persona se vea obligada a reconocer el problema.
De lo contrario, rescatar y hacer un proyecto con un compañero, o hacer un proyecto de mentor / aprendiz donde esa es la dinámica desde el principio.
fuente
Para agregar puntos adicionales a todas las excelentes respuestas:
fuente
Debería seguir haciendo su código de la manera que considere correcta, con comentarios y demás, y hacer una copia de su versión del código (en caso de que cambie su código).
No pelees, no te enojes, solo sonríe cuando veas sus malas decisiones.
Solo se quejan como usuario, si está funcionando no se quejen.
No te rindas tampoco, es importante acostumbrarse a las personas que son diferentes a ti, eso sucederá en un trabajo real.
fuente