En uno de mis libros de software favoritos, Facts and Falacies of Software Engineering, de Robert Glass, Fact 37 señala:
Las inspecciones rigurosas pueden eliminar hasta el 90 por ciento de los errores de un producto de software antes de ejecutar el primer caso de prueba.
¡Y la mejor parte es que las revisiones son rentables!
- ¿Qué tan bueno es MacBook para software y aplicaciones de ingeniería electrónica?
- ¿Desarrollar un software que nadie usa es una pérdida de tiempo?
- ¿Cuáles son los diferentes dominios de desarrollador de software integrado?
- ¿Por qué querría trabajar en Facebook?
- ¿Por qué las computadoras no pueden programarse por sí mismas?
Además, los mismos estudios muestran que el costo de las inspecciones es menor que el costo de las pruebas que serían necesarias para encontrar los mismos errores.
Uno de mis otros libros de software favoritos, Code Complete de Steve McConnell, señala que,
la tasa promedio de detección de defectos es solo del 25 por ciento para pruebas unitarias, 35 por ciento para pruebas de funcionamiento y 45 por ciento para pruebas de integración. En contraste, la efectividad promedio de las inspecciones de diseño y código es de 55 y 60 por ciento .
Tenga en cuenta que McConnell se refiere a la evidencia de la efectividad promedio, mientras que Glass se refiere a la evidencia de la efectividad máxima.
Sin embargo, la mejor parte es que Code Review no solo es útil para encontrar defectos. Es una excelente manera de difundir información sobre estándares y convenciones de codificación a otros, así como una gran herramienta de enseñanza. Aprendo mucho cuando mis compañeros revisan mi código y lo uso como una oportunidad para enseñar a otros que envían RP a mis proyectos.
Revisión efectiva del código
Notará que Glass y McConnell usan el término “inspección de código” y no revisan. Muchas veces, cuando pensamos en la revisión del código, pensamos simplemente en mirar el código un poco hacia arriba y hacia abajo, hacer algunos comentarios breves sobre errores evidentes evidentes y luego llamarlo un día.
Sé que he sido culpable de este enfoque de revisión de código “drive-by”. Es especialmente fácil de hacer con solicitudes de extracción.
Pero a lo que se refieren estos caballeros es a un enfoque mucho más exhaustivo y riguroso para revisar el código. Descubrí que cuando lo hago bien, una revisión adecuada del código es tan intensa y mentalmente agotadora como escribir código, si no más. Normalmente me gusta tomar una siesta después.
Aquí hay algunos consejos que he aprendido a lo largo de los años para hacer bien las revisiones de código.
Revise una cantidad razonable de código a la vez
Este es uno de los consejos más difíciles de seguir. Cuando comienzo una revisión de una solicitud de extracción, siento la tentación de terminarla de una sola vez porque soy impaciente y quiero volver a mi propio trabajo. Además, sé que otros están esperando la revisión y no quiero retrasarlos.
¡Pero trato de recordarme que la revisión de código es mi trabajo ! Además, una revisión mal hecha no es mucho mejor que ninguna revisión. Cuando te das cuenta de que las revisiones de código son importantes, entiendes que vale la pena el tiempo extra para hacerlo bien.
Por lo general, me detengo cuando llego al punto de agotamiento de la revisión y me encuentro saltando el código. Solo tomo un descanso, paso a otra cosa y vuelvo a hacerlo más tarde. ¿Qué mejor momento para ponerse al día con los episodios de Archer?
Centrarse en el código y no en el autor.
Esto tiene más que ver con el aspecto social de la revisión de código que con la búsqueda de defectos. Intento hacer todo lo posible para centrar mis comentarios en el código y no en la capacidad o el estado mental del autor. Por ejemplo, en lugar de preguntar “¡¿Qué demonios estabas pensando cuando escribiste esto ?!”, diré: “No tengo claro qué hace esta sección del código. ¿Lo explicaría usted?
¿Ver? En lugar de atacar al autor, me estoy centrando en el código y en mi comprensión del mismo.
Por supuesto, es posible seguir este consejo y seguir siendo insultante: “Este código me hace querer arrancarme los ojos entre mis ataques de vómitos”. Si bien esta oración se centra en el código y en cómo me hace sentir, todavía está implícitamente insultante para el autor. Intenta evitar eso.
Mantenga una lista de verificación de revisión de código
Una lista de verificación de revisión de código es una herramienta realmente excelente para llevar a cabo una revisión de código efectiva. La lista de verificación debe ser un recordatorio suave de problemas comunes en el código que desea revisar. No debería representar las únicas cosas que revisas, sino un conjunto mínimo. Siempre debe involucrar a su cerebro durante una revisión en busca de cosas que podrían no estar en su lista de verificación.
Seré honesto, cuando comencé a escribir esta publicación, solo tenía una lista de verificación mental que revisé. En un esfuerzo por evitar ser un hipócrita y subir de nivel mi revisión de código, creé una lista de verificación.
Mi lista de verificación incluye cosas como:
- Asegúrese de que haya pruebas unitarias y revise los que primero buscan vacíos en las pruebas. Las pruebas unitarias son una forma fantástica de comprender cómo los demás deben usar el código y aprender cuál es el comportamiento esperado.
- Revisar los argumentos de los métodos. Asegúrese de que los argumentos de los métodos tengan sentido y estén validados.
- Busque excepciones de referencia nula. Las referencias nulas son una perra y vale la pena buscarlas específicamente.
- Asegúrese de que los nombres, el formato, etc. sigan nuestras convenciones y sean coherentes. Me gusta una base de código que sea bastante consistente para que sepa qué esperar.
- Las cosas desechables se eliminan. Busque usos de los recursos que deberían eliminarse pero que no lo están.
- Seguridad. Existe un proceso completo de revisión de amenazas y mitigación que se incluye en este segmento. No voy a entrar en eso en esta publicación.
También tengo listas de verificación separadas para diferentes elementos específicos de la plataforma. Por ejemplo, si estoy revisando una aplicación WPF, estoy buscando casos en los que podamos actualizar la interfaz de usuario en un subproceso que no sea de interfaz de usuario. Ese tipo de cosas.