Trabajando como desarrollador exclusivo: revisando el código

39

No tengo más remedio que trabajar por mi cuenta, y no puedo encontrar una solución adecuada para revisar mi trabajo, verificar la cordura, tener a alguien con quien intercambiar ideas, discutir las mejores prácticas, etc.

Pensé que obtendría una respuesta a través del artículo de Jeff Atwood: En Programación, One Is The Loneliest Number , lo mejor que pude encontrar sobre el tema, pero resultó que solo reiteraba mi pregunta.

Sé que los sitios de Stack Exchange como este, y la revisión de código son una respuesta potencial obvia, pero como muchos apreciarían, está lejos de ser ideal:

Si bien no puedo enumerar todos los escollos, a menudo, formular una pregunta y encuadrarla en un problema autónomo a menudo requiere tanto trabajo que para cuando la has preparado lo suficiente, has respondido tu propia pregunta en más tiempo de lo que hubiera tomado de otra manera. Además, ocultar detalles para hacer una pregunta bien definida elimina la posibilidad de que alguien descubra problemas en los que no había pensado. Además, si bien no puedo identificarlo, la capacidad de respuesta de la conversación libre no puede igualarse con ninguna forma de discusión textual en Internet que se me ocurra. Por último, pero no menos importante, no quiero publicar todo mi proyecto para que el mundo lo vea por el resto de la eternidad, por razones obvias.

¿Hay alguna otra respuesta además de pagarle a un consultor para que revise mi código?

CL22
fuente
3
También tengo este problema (sin embargo, con proyectos divertidos), solo que tengo la suerte de tener algunos amigos programadores cercanos dispuestos a revisar mi código.
Austin Hyde
23
Siempre puedes hablar contigo mismo, esto es especialmente bueno para los controles de locura :-)
Danny Varod
44
Si puede pagarlo, esta es una de las razones por las cuales es bueno alquilar una oficina / escritorio en un parque empresarial (idealmente donde las personas de TI se agrupan). Tuve muchos buenos chats con la gente de TI en mis oficinas vecinas cuando era un programador solitario que trabajaba en una oficina.
JW01
66
Trabajar solo puede ser mejor que trabajar con idiotas.
Trabajo
2
Realmente no es una solución, pero puede pasar el rato en el chat SO o en un canal IRC apropiado; eso podría aliviar algunas de las cargas de trabajar solo.
Tikhon Jelvis

Respuestas:

36

He estado en tu lugar y no creo que haya una solución fácil. Pagar a un consultor para que revise su código no es una buena forma de gastar dinero. Si su problema es que se siente solo y no tiene a nadie con quien hablar sobre programación, entonces no puedo ayudarlo, pero si está realmente interesado en mejorar la calidad de su código, lo mejor que puede hacer es configurarlo a un lado y volver a eso en una semana más o menos. Si el código es realmente malo, será obvio porque no podrá darle sentido y puede comenzar a refactorizarlo para que tenga sentido. Después de algunas iteraciones de este proceso, comenzará a notar los patrones de código que hacen que el código sea fácil de entender y su calidad mejorará.

davidk01
fuente
Bueno uno! ... 15
Marjan Venema
2
En teoría, esto podría funcionar, en la práctica NO HAY FORMA EN EL INFIERNO que va a volver a mirar el código que escribió hace 2 semanas si funciona. Probablemente tampoco debería hacerlo. Si funciona, volver a pasar el tiempo en él por la única razón de hacerlo "más bonito" es una pérdida de tiempo, debe hacerse cuando y si se toca de nuevo.
Thomas Bonini
3
@Krelp: Miro el código pasado todo el tiempo y no hay forma de que pueda agregar funciones y, en general, mantener el software sin mirar el código escrito previamente. No existe una arquitectura perfecta y las abstracciones con fugas son la regla más que la excepción, por lo que es inevitable mirar el código escrito anteriormente. Sé que los codificadores de maratón están idolatrados en los círculos de programación, pero la codificación de maratón rápidamente conduce a proyectos agotados y abandonados, por lo que además de mejorar la calidad del código, tomar descansos y volver también me mantiene cuerdo.
davidk01
@david: mencionaste mirar hacia atrás en el código después de un período de tiempo fijo, incluso si no hay necesidad de hacerlo en este momento. Inicialmente no dijiste que volvieras a mirar el código solo cuando debías hacerlo para agregar nuevas funciones ... Entonces, si, de acuerdo con lo que dijiste, finalmente tienes que volver a mirar todo el código antiguo, ¿por qué no hacerlo? Entonces, ¿en un momento que sea relevante en lugar de después de un período de tiempo fijo?
Thomas Bonini
3
@Krelp: si tiene la confianza suficiente en sus habilidades, siga adelante y solo mire el código de trabajo cuando lo desee, pero si recién comienza y no está seguro de qué tan bien está estructurando su código, busque continuamente volviendo a lo que escribió hace unas semanas y refactorizarlo es una muy buena manera de aprender la estructura de código adecuada. Mi consejo fue para las personas que buscan mejorar y llegar al punto en que la reestructuración del código escrito anteriormente se vuelve cada vez menos necesaria porque la versión inicial tiene la estructura extensible adecuada. Eres más que bienvenido a ignorar mi consejo.
davidk01
17

¿Hay alguna otra respuesta además de pagarle a un consultor para que revise mi código?

No.

Mi consejo es unirse a un grupo local de desarrolladores / usuarios y hablar sobre sus ideas con otros. Habla sobre tu diseño. Pregúntele a otros cómo han abordado ciertos problemas.

Si verifican su diseño, incluso sin mirar su código, eso debería ser lo suficientemente bueno.

Imbéciles
fuente
44
Muchos escritores profesionales hacen esto.
JeffO
10

Existen técnicas de autocomprobación, como el desarrollo basado en pruebas que pueden ayudar a proporcionar comentarios. Cuando se hace difícil saber que su arquitectura probablemente está fuera de control.

formular una pregunta y encuadrarla en un problema autónomo a menudo requiere tanto trabajo que, cuando la ha preparado lo suficiente, ha respondido su propia pregunta en más tiempo del que hubiera requerido de otra manera.

Problema resuelto. No necesita comentarios externos sobre cada línea de código para mejorar, solo un buen muestreo en las bifurcaciones clave en el camino y autoevaluaciones cuidadosas en los puntos intermedios.

Debe superar la idea de que puede mantener el mismo nivel de calidad trabajando solo en la misma cantidad de tiempo que alguien que trabaja en un equipo. Hay una razón por la cual las personas trabajan en equipos. La buena noticia es que no tiene conflictos sobre las decisiones de diseño. La mala noticia es que no tiene conflictos sobre las decisiones de diseño. Afortunadamente, el tiempo extra que pasa manteniendo la calidad se ve compensado en parte por las ventajas de trabajar solo.

Karl Bielefeldt
fuente
No veo cómo TDD es una respuesta aquí.
Aaronaught
1
@Aaronaught Estoy en el mismo barco que el TS y puedo asegurarle que escribir pruebas (ya sea antes del código como en TDD o después) es LA manera de verificar si su código es correcto. Si no puedes probarlo, es malo.
stijn
1
@stijn: Puede ser (algo) cierto que el código incorrecto es más difícil de escribir para las pruebas, pero nunca es imposible: así es como se actualizan los sistemas heredados. Incluso si aceptamos al pie de la letra la dudosa afirmación de que un buen código conduce a buenas pruebas, la afirmación inversa aún no está probada; una prueba de aprobación no significa que el código tenga una calidad razonable. De hecho, la premisa de TDD - "rojo, verde, refactorizador" - esencialmente significa escribir código descuidado que pasa la prueba y luego refactorizarlo para mejorar la calidad, por lo que al final del día estás de vuelta donde empezaste, solo con pruebas.
Aaronaught
2
@Aaronaught: usted hace puntos válidos, pero aún mantengo mi punto de vista de que las pruebas son una muy buena forma de verificar la cordura del código (aunque no es la única forma); la experiencia me lo ha demostrado, es especialmente útil ver dónde se viola gravemente SRP.
stijn
@ Mark: Eso es bueno, pero todas estas anécdotas valen incluso menos que un reclamo publicitario de "Perdí 50 libras en 2 semanas", porque lo que se está hablando no ha sido medido , y mucho menos observado en condiciones controladas. Sí, hay evidencia de que TDD reduce los defectos previos a la liberación, y eso es una gran cosa; Las revisiones de código resuelven un problema completamente diferente y no hay base para suponer que TDD resuelve el mismo. Probablemente, las pruebas unitarias de la "vieja escuela" en realidad son mejores para esto porque imponen restricciones de capacidad de prueba en clases individuales en lugar de grupos de ellas.
Aaronaught
6

Recomendaría hacer la mayor cantidad de redes posible en conferencias y grupos de usuarios locales. Conozco a muchos desarrolladores que disparan fragmentos de código desinfectado de un lado a otro por correo electrónico o estoy todo el tiempo solo para mantener la nitidez y revisar los algoritmos juntos. No, no es una conversación cara a cara, y sí, es una molestia desinfectar el código a veces, pero una revisión de código de 20 mensajes instantáneos de vez en cuando puede ser bastante útil, especialmente cuando estás desesperado por un segundo par de ojos.

Morgan Herlocker
fuente
4

Estoy en una situación similar y confío mucho en Stack Overflow para obtener comentarios sobre preguntas complicadas. También encuentro que, en virtud de tener que escribir una descripción del problema, la respuesta a menudo se vuelve obvia. En términos de mejores prácticas, soy un desarrollador de .Net y uso ReSharper, que ofrecerá sugerencias de buenas prácticas alternativas al código que estoy escribiendo (que a veces simplemente ignoro, puede ser un poco pedante). Y otra herramienta útil es FxCop, que realizará un análisis de código estático y resaltará cualquier problema que no coincida con su conjunto de reglas.

De lo contrario, depende de usted leer y mantenerse actualizado sobre las prácticas actuales. Me gusta Alvin Ashcraft's Morning Dew por enlaces a las novedades y mejoras en el mundo .Net.

David Clarke
fuente
4

Sugeriría intentar crear (o encontrar) un pequeño grupo de usuarios. Haga que su código esté disponible y haga que todos se comprometan para que funcione: media hora o más al día.

jmoreno
fuente
3

Un comentario constructivo de mi experiencia es que durante los primeros años de su desarrollo sería muy importante, aunque no obligatorio, que un desarrollador experimentado revise su código para sentar las bases. Una vez que tenga experiencia, puede seguir el enfoque sugerido por @ davidk01, es decir, revisar su propio código periódicamente para mejorar la calidad del código.

Karthik Sreenivasan
fuente
2

No conozco detalles de su situación, pero donde estoy ahora hay muchos estudiantes hambrientos de experiencia que están más que felices de trabajar como pasantes y aprender algo.

Puede parecer un trabajo extra para ti manejarlos y enseñarles esto y aquello, pero hemos estado allí cuando comenzamos y creo que es nuestro turno de pagar.

No son expertos e incluso pueden confundirlo a veces, pero generalmente desafían todo y están llenos de ideas y son excelentes para una discusión en la que debe defender cada detalle de su código.

azerafati
fuente
2

Si bien no puedo enumerar todos los escollos, a menudo, formular una pregunta y encuadrarla en un problema autónomo a menudo requiere tanto trabajo que para cuando la has preparado lo suficiente, has respondido tu propia pregunta en más tiempo de lo que hubiera tomado de otra manera.

Experimento lo mismo para> 75% de las preguntas que publico.

Sin embargo, ese no es un argumento para no molestarse en hacerlo. Esto es efectivamente la depuración del pato de goma. Está encontrando respuestas a preguntas que cree que podrían surgir en respuesta a su pregunta; lo que significa que está pensando en el problema desde los puntos de vista de diferentes personas; lo que significa que está pensando en el problema desde todas las direcciones posibles; cuál es la mejor manera de encontrar la falla.

En el mejor de los casos, ha demostrado de manera concluyente que claramente no puede pensar en la respuesta aquí. En el "peor", terminas respondiendo tu propia pregunta. Tenga en cuenta las citas, porque esto no es malo en absoluto. Tal vez fue un poco ineficiente, pero resolver el problema lentamente es mejor que decidir rápidamente no abordar el problema . Tendrás más rapidez para resolver el problema eventualmente.

Caso en punto:

Cuando era un desarrollador incipiente, me ocupé muchas veces de la página de errores ASP.Net . Necesitaba buscar el mensaje en Google para descubrir qué estaba mal. Pueden pasar varias horas antes de obtener la solución correcta. Básicamente cometí todos los errores en el libro y posteriormente tuve que lidiar con las consecuencias de tener que depurar los problemas.

Ahora, cuando aparece un error, ya conozco a los "sospechosos habituales" de lo que podría estar causando el problema. Mi lista mental de "sospechosos habituales" se basa efectivamente en los problemas con los que he tenido más problemas durante mi carrera. Sin haber hecho el trabajo de pierna de horas de Google en tiempo ineficiente, nunca hubiera hecho esta lista mental . Pero ahora que tengo esa lista mental, soy considerablemente más rápido en la resolución de problemas.


Además, si bien no puedo identificarlo, la capacidad de respuesta de la conversación libre no puede igualarse con ninguna forma de discusión textual en Internet que se me ocurra.

Estoy un poco en desacuerdo aquí. Tienes razón en que la comunicación por Internet responde menos, pero estás equivocado (en mi opinión) de que esto es malo para ti.

Como desarrollador solitario, dependerá de la depuración del pato de goma. El ingrediente clave para que RDD funcione es que anticipa las preguntas que el pato de goma pueda tener para usted. Obviamente, no puedes confiar en lo que dice realmente el pato de goma.

Cuando se trata de sistemas de mensajería lenta (publicación en StackOverflow o comunicación por escrito), tiene el incentivo inherente de asegurarse de hacerlo bien la primera vez. Porque la necesidad de corregir un error será un proceso lento y arduo.
En comparación, considere que los sistemas de mensajería rápida (conversación, mensajería instantánea), puede corregir algo inmediatamente . La capacidad de corregir rápidamente algo hace que las personas tengan menos incentivos para asegurarse de que sea correcto.

Cuatro casos en punto:

  • Cuando estoy haciendo mi propia lista de análisis / tareas personales como desarrollador, sigo usando lápiz y papel. Me di cuenta de que paso por alto las suposiciones y falsedades cuando escribo mis notas, porque mi mente piensa que "puedo arreglar esto fácilmente más tarde". Sin embargo, tener que corregir algo que ha escrito en papel es molesto, necesita tachar las cosas y escribir entre líneas, y el documento se ve mucho peor cuando tiene garabatos. Escribir en papel me hace comprobar los hechos antes de comprometerme a escribirlo. Esto capta muchos malentendidos antes, incluso antes de que escriba un código que produzca errores.
  • Mi abuela era secretaria (edad de la máquina de escribir). Hacer un error tipográfico en un documento formal significaba tener que volver a escribir toda la página. Mi tía es secretaria (edad del procesador de textos). Puede confiar en un corrector ortográfico automático, y los errores se pueden solucionar fácilmente y con un mínimo esfuerzo. Como era de esperar, mi abuela comete considerablemente menos errores de escritura y ortografía en comparación con mi tía.
  • Los videojuegos solían imprimirse en cartuchos. Arreglar un error después del lanzamiento era casi imposible. Debería reimprimir todos los cartuchos, distribuirlos a todos los proveedores y esperar que los vendedores puedan ponerse en contacto de alguna manera con los clientes que ya compraron el juego. Costaría toneladas de dinero (el doble del costo de producción física) y aún no llegaría a algunos clientes. Ahora, en la era de los parches de Internet, los desarrolladores de juegos han demostrado una inversión mucho menor en probar sus juegos para que puedan evitar los errores del día de lanzamiento, porque es mucho más fácil simplemente enviar una solución a cada cliente directamente. El impacto de cometer un error se minimiza a un punto en el que es mejor solucionar un puñado de problemas después del hecho, en comparación con tener que probar todas las posibles errores que pueden ocurrir
  • Solía ​​vivir en un departamento del tercer piso, sin ascensor, y a menudo tenía que estacionar una o dos calles de mi edificio. Casi nunca olvido tomar algo de mi auto. Ahora vivo en una casa con mi auto justo a mi lado en el camino de entrada. Me olvido de sacar cosas de mi auto todo el tiempo .

La idea subyacente aquí es que un sistema de intercambio difícil incentiva a las personas a realizar intercambios correctos y verificados . La severidad del castigo (= proceso de corrección difícil) te enseña a no cometer errores.


Además, ocultar detalles para hacer una pregunta bien definida elimina la posibilidad de que alguien descubra problemas en los que no había pensado.

Cuando crea un MCVE , no debe crearlo y publicarlo en la pregunta. Primero debe hacerlo usted mismo , para poder aislar el problema. Y luego, cuando crees que el problema ya no se puede reducir, y aún no ves la causa; entonces tiene una pregunta válida para StackOverflow.

Caso en punto:

Siempre tengo un segundo Visual Studio ejecutándose con una aplicación de consola simple llamada Sandbox. Cada vez que me encuentro con un problema técnico, copio el código ofensivo en el sandbox y empiezo a jugar con él.

  • ¿Qué sucede cuando cambio esta configuración?
  • ¿Puedo reproducir el problema si acorto el código?
  • ¿Qué ajustes hacen posible / imposible reproducir el problema?

En el 90% de los casos, encuentro la causa del problema porque la caja de arena me ayudó a mirar el código ofensivo sin distraerme con el contexto circundante (o, por ejemplo, cualquier incertidumbre sobre los valores que vienen para diferentes partes del código.

En el otro 10% de los casos, me queda el código mínimo para reproducir el problema, que sirve como un fragmento de ejemplo perfecto para publicar en StackOverflow.


Por último, pero no menos importante, no quiero publicar todo mi proyecto para que el mundo lo vea por el resto de la eternidad, por razones obvias.

Cuando ya tiene su MCVE, no debería tener mucha información personal (o de la empresa) en él. Si lo hace, dado que el código es mínimo, es fácil cambiar el nombre de las cosas a un ejemplo más básico de foo / bar / baz.

Flater
fuente