Hay un gran libro sobre este tema llamado “Writing Solid Code” (http://www.microsoft.com/mspress…)
La idea básica es que cuando las cosas se complican y comienzan a ir mal, realmente necesitas una forma clara de determinar qué funciona y qué no. Y cuando algo sale mal, debe notarlo lo más cerca posible de la raíz del problema.
Aquí hay algunas sugerencias prácticas, algunas de Writing Solid Code y algunas de mi experiencia:
– Active todas las advertencias del compilador y arregle todo lo que informe.
– Si conoce un error, corríjalo antes de hacer cualquier otra cosa.
– Divida su código en pequeñas funciones que tengan entradas y salidas claras y la menor cantidad posible de efectos secundarios. Déles nombres que indiquen claramente lo que hacen.
– Escribir pruebas para cada función.
– Haga que todas las funciones verifiquen entradas y salidas razonables.
– Identifique todos los invariantes que pueda y verifíquelos con afirmaciones.
– Evita las macros si puedes. Son geniales para algunas cosas, pero si se salen de control pueden hacer que sea imposible leer el código.
– Fallo rápido: si algo no tiene sentido, no continúe con el
mejor esfuerzo y deja que se vuelva aún más extraño. Elevar un error real de inmediato
o volcar el núcleo.
– Fortifique sus subsistemas: cosas como la administración de memoria deben verificar si hay errores comunes y facilitar la inspección de lo que sucede cuando hay errores.
– Dos lugares en los que comúnmente tiene errores difíciles son la asignación de memoria y el subprocesamiento. Haga un plan claro y directo para ambos: quién posee qué memoria, cuándo y qué bloqueos cubren qué, qué subprocesos pueden adquirirlos de qué capas de código y en qué orden. Si estos se complican, tenga una forma de depurarlos, o incluso afirme mejor a los invariantes.
– Si tiene un algoritmo complicado que es difícil de probar, impleméntelo de dos maneras diferentes y compare los resultados cuando lo esté probando.
Lo más importante, haga que todo sea lo más claro y directo posible, haga una cosa a la vez en el código y haga que el código se lea lo más fielmente posible a la forma en que lo describiría en inglés a un amigo.
- ¿Tenía Fermat una prueba de su último teorema, o solo estaba mintiendo?
- Las pruebas de los grandes problemas matemáticos parecen ser cada vez más largas y complejas. ¿Sugiere esto que la tasa de progreso en matemáticas puede eventualmente disminuir a cero?
- ¿Cómo te vuelves mejor en las pruebas?
- ¿Cuál fue la mentira más concertada jamás contada por los matemáticos?
- ¿Se puede decir que ocurra algo sin dejar una pizca de evidencia?