Cómo escribir código libre de errores - ANTIGUO

¡En serio, nuestras vidas dependen de ello!

Tenga en cuenta: ¡He realizado una actualización de este artículo que puede encontrar aquí!

Si la depuración es el proceso de eliminar errores de software, entonces la programación debe ser el proceso de ponerlos en funcionamiento - Edsger Dijkstra

Escribir código más allá de "¡Hola mundo!" Pronto se vuelve bastante complejo. Lleva años abandonar el nivel junior, tal vez no por título sino por nivel de competencia.

Los errores son vistos como una parte inevitable del software. Seguramente el número de errores generados cae con la antigüedad. Y parece que hay algunos unicornios que han demostrado que es posible acercarse a cero.

Pero código totalmente libre de errores, ¿es eso posible? La mayoría responderá a esto con un NO empático, y llamará a cualquiera que diga lo contrario.

La cuestión es: no creo que tengamos otra opción.

Una realidad digital

¿Cargarías tu mente en una computadora con Windows XP SP2?

Lo digital se ha convertido en una parte tan importante de nuestras vidas que ni siquiera pensamos en ello, como el aire. Solo cuando no funciona pensamos en ello. Y las consecuencias cuando se rompe se hacen más grandes y más sistémicas para cada año.

He cubierto este y algunos escenarios futuros en un artículo anterior. Alerta de spoiler: es bastante grave (no el artículo, las consecuencias).

La línea de fondo:

Lo digital es inherentemente frágil. Las cosas digitales se rompen si no se mantienen constantemente.

Este es un hecho del que nadie habla. Uno podría preguntarse por qué ...

La fragilidad como modelo de negocio

Cuando un fabricante de automóviles vende un automóvil, lo último que desea es que un cliente espere mantenimiento durante los años cubiertos por la garantía. Pierden dinero en mantenimiento. En la industria del software, por otro lado, podemos firmar acuerdos de mantenimiento y ganar dinero cuando las cosas se rompen.

Para las consultoras no hay incentivos para crear software que no requiera mantenimiento. Ni siquiera hay incentivos para simplificar el proceso, si todos están de acuerdo en que lo digital es una mierda complicada y que se le puede pagar por ello, ¿por qué cambiar un concepto ganador?

Para las empresas que desarrollan sus propios productos y servicios digitales debería existir, pero dado que es "imposible" y quien dice lo contrario no tiene "idea" , ¿por qué cuestionar el consenso?

En cualquier caso, el resultado es que no hablamos de eso. Y mientras estamos ocupados parcheando nuestra realidad digital, estamos caminando sonámbulos hacia un mundo que literalmente puede desmoronarse en cualquier momento.

Entonces, ¿qué es un error?

Un error puesto a descansar

Como de costumbre, comencemos con una definición. Aquí está Wikipedia:

Un error de software es un error, falla, falla o falla en un programa o sistema informático que hace que produzca un resultado incorrecto o inesperado, o que se comporte de manera no intencional

El código en sí puede ejecutarse perfectamente, pero si no hace lo que se supone que debe hacer, entonces es bastante inútil. Al igual que una aplicación que tarda años en iniciarse, o agota la batería en minutos, o es fácilmente pirateable. Aquí hay una lista de diez aspectos para juzgar la calidad del software.

Un desafío digital se puede resolver de un millón de maneras. De estos, una fracción está bien, lo que significa que funcionan, y una fracción de esa fracción es "buena". El desafío no es solo escribir código que se comporte sino que también se desempeñe en todos los demás aspectos.

¡Chrome volvió a romper Internet!

Cómo abordar una tarea imposible

Entonces aquí es donde comenzamos. Todo el mundo dice que es imposible y que no hay signos que apunten en una dirección diferente. Las cosas digitales se están volviendo cada vez más complejas y la cantidad de errores es una función exponencial de la complejidad (o eso parece). La evolución digital acaba de comenzar a acelerarse y continuará haciéndolo. Puedo seguir y seguir.

¡Parece una tarea imposible, y una que suplica que se resuelva!

Los problemas imposibles tienen una atracción casi irresistible para mí. La complejidad es casi infinita, por lo que para desenredar el problema debemos comenzar en el extremo derecho. Al resolver los desafíos en el orden correcto, otros problemas se disolverán y nos acercaremos más y más al núcleo.

En este caso, necesitamos establecer algunos conceptos básicos y luego profundizar desde allí.

¡Olvidaste una coma, ahí!

Parte 1: Lo Básico

Aquí hay algunos principios generales que no se limitan al desarrollo. Pueden sentirse demasiado básicos y generales, pero no subestimes su valor. No sé cuántas veces he verificado estos principios simples en escenarios del mundo real. Lamentablemente soy un alumno lento ...

¡Pero solo estás diciendo lo obvio!

Esa es la desventaja de recordarle a la gente cosas que ya saben en algún lugar en el fondo. Pero aquí está la cosa:

Si fuera tan obvio, lo estaríamos haciendo todo el tiempo, ¿verdad?

Y ya sabemos que no. Los errores están en todas partes, las cosas digitales no están hechas para durar, la singularidad se acerca y mi almacenamiento en la nube acaba de ser pirateado.

Entonces, si tiene prisa y no desea que se le recuerde lo "obvio", espere las siguientes partes de esta serie, ¡espero que lleguen muy pronto!

Para el resto de ustedes, creo que hay más en los principios a continuación de lo que parece. ¡Así que vamos a sumergirnos!

¡Las mejores prácticas apestan, los principios gobiernan!

Las mejores prácticas, consejos prácticos sobre la mejor manera de hacer cosas, ¿qué no hay que amar? Más de lo que puedas pensar.

Las mejores prácticas son geniales pero tienen sus limitaciones. Para generalizar: se centran en qué hacer, pero no por qué, a menudo son demasiado específicos y se traducen mal entre contextos, en muchos casos una descripción más correcta es "gusto personal" y no tiene ningún efecto que importe en el mundo real, y finalmente llamar a algo "el mejor" te engaña haciéndote creer que ese es el caso, que probablemente no lo sea.

Los principios, por otro lado, se centran en el por qué, pueden aplicarse en contextos completamente diferentes, son fácilmente falsificables y, por lo tanto, posibles de confiar, y funcionan como un soporte y brújula para la toma de decisiones.

Un principio es como una regla que nos obliga a pensar por nosotros mismos.

Puedes pensar que soy exigente con las palabras, pero bueno, soy yo, la semántica es mi segundo nombre. Y en serio, realmente, realmente creo que es importante. Todo se suma.

Detrás de cada mejor práctica de cualquier valor hay un principio. Defínalo, verifícalo y, si se sostiene, construye sobre él y extiéndelo. ¡El aumento de valor es masivo!

Escape Dependencia Infierno

¿Hora de desacoplar?

Las dependencias son MALAS. Las dependencias crean fragilidad. Una falla o cambio de comportamiento en una parte afectará todo el sistema o proceso. Dado que nuestro objetivo es el código libre de errores, debemos eliminar las dependencias cada vez que las encontremos.

No creo que nadie esté en desacuerdo con esto. Aún así, ¿estamos viviendo por esto? ¿Estamos eliminando todas las dependencias que podamos?

Hay muchas dependencias que parecen imposibles de solucionar, compiladores, sistemas operativos, navegadores, hardware y más. En la parte 2 veremos cómo mitigar algunos de esos riesgos.

Pero los desarrolladores están voluntariamente encerrándose en el código de otras personas y creando dependencias que no son necesarias. En ninguna parte es esto tan obvio como en el ecosistema de JavaScript. Hay bibliotecas y marcos para todo, se actualizan constantemente, lo que garantiza que el mantenimiento debe continuar para siempre.

Cuando los desarrolladores de JavaScript solicitan trabajos, hablan sobre qué marcos usan. Pero muy pocos pueden construir algo útil con vanilla JS.

Lo entiendo, hay razones, y algunas son realmente buenas. Pero si queremos llegar a un código libre de errores, entonces tenemos que juzgarlos de manera diferente. Son dependencias y deben manejarse en consecuencia. ¡¡Exterminar!!

¡Este será el tema de la parte 2!

Siempre cree valor para el futuro

Supongamos que resolvió un problema de desarrollo complejo, ahora todo funciona según lo previsto, ¡eso es genial! ¡Felicidades!

Ese era el objetivo, ¿verdad? ¿Misión cumplida? Bueno, en realidad, esa es una parte bastante pequeña del objetivo si queremos llegar al software libre de errores. Debemos extraer el máximo valor de este logro. Entonces, ¿cuál es realmente el valor, excepto que funciona?

Supongamos que documentó la solución, entonces debería ser posible que otra persona entienda lo que hizo y aprenda de ella. Lo que probablemente no entiendan es POR QUÉ lo resolvió de esa manera, y no ven todas las formas en que trató de resolverlo antes de elegir este camino. ESO hubiera sido bastante valioso, ¿no estás de acuerdo?

Eso es si alguien realmente lo lee ...

La documentación es solo una de las muchas cosas que tenemos totalmente al revés.
Para generar valor para el futuro, necesitamos aprender a transferir información y conocimiento a otros, para que no tengan que inventar la rueda cada vez.

No solo para otras personas, incluso la computadora está en el extremo receptor, le estamos diciendo a la computadora qué hacer, es decir, la transferencia de información.

Se ha realizado un gran trabajo, se ha creado tanto conocimiento, que se desperdicia totalmente, nadie lo sabe. Incluso en el equipo más pequeño, el desafío de la transferencia de información es enorme y los desarrolladores repiten los mismos errores.

Ser capaz de capturar todo este conocimiento es un paso necesario para el software libre de errores. Este será el tema de la parte 3, ¡emocionante!

Planifique con anticipación: ya sabe lo que viene

¡Se tira el sombrero! ¡¡Esta encendido!!

O al menos deberías saberlo. Nunca comience una tarea sin comprender hacia dónde se dirige el proyecto y cómo encaja. Esa única línea de código es parte de algo enormemente más grande, y ni siquiera está restringida al código. Si no ve el panorama general, ¿cómo puede tomar las decisiones correctas en los detalles?

Lo mismo se aplica al desarrollo. Saber hacia dónde se dirige (es decir, 100,000 usuarios simultáneos) hace que algunas de las primeras opciones de ruta sean bastante claras.

Por otro lado, sepa lo que no sabe. YAGNI, no lo vas a necesitar. Ser inteligente demasiado pronto es una simple estupidez. Entonces hay un equilibrio. Saber qué decisiones deben tomarse y cuándo es clave.

La siguiente es la comprensión del orden en que deben realizarse las tareas. Un resultado final puede consistir en una larga cadena de tareas donde cada tarea depende de la anterior. Hacer las cosas en el orden incorrecto tarde o temprano generará trabajo adicional o disminuirá la calidad del resultado final.

No saber a dónde se dirige y por qué podría causar más daño que bien. La planificación, las especificaciones y la documentación se mencionarán en la parte 3, pero finalmente obtendrán su propio artículo. Gran tema!

Si algo se siente complicado ...

El punto de cruz es una forma muy complicada de transmitir un mensaje ...

Si has leído alguno de mis artículos sobre creatividad, hay una cosa que repito una y otra vez:

Si algo se siente complicado, entonces probablemente lo estamos haciendo de manera incorrecta.

No hay otro contexto en el que esto sea más cierto que en la codificación. Algunos desafíos de código son complejos, pero es cuando parece complicado que debemos dar un paso atrás. Comience aquí para obtener la línea de pensamiento completa (¡hay elefantes!)

Esta sensación de que debe haber una mejor manera es un disparador para algunas soluciones excelentes e innovadoras. Y reducir toda la complejidad es una parte necesaria para llegar a la meta, el software libre de errores.

"Lo suficientemente bueno" no es lo suficientemente bueno

¿Es este título lo suficientemente bueno?

Si va a escribir un código libre de errores, entonces no existe lo suficiente, ¡tiene que ser perfecto, sin presión!

Hay un millón de razones por las cuales las cosas no son perfectas. Plazos, dependencias externas, imprevistos. Pero cortar esquinas es solo una estrategia a corto plazo (muy corta). Finalmente, alguien tiene que actualizar lo que ha hecho, un año después las cosas se volverán borrosas, incluso para usted. Toda descuido volverá tarde o temprano y te morderá a ti oa alguien más.

Y no hay futuro para una base descuidada, si te das cuenta de que has resuelto las cosas de manera incorrecta, rehazalo y aprende de ello. Tirar cosas puede parecer un desperdicio, pero al final casi siempre ahorra tiempo, crea un mejor resultado y reduce el estrés.

No puedes pulir un turd

Continuará…

... y hay mucho más que decir. Dos artículos más en el camino, uno sobre Dependency Hell y otro sobre Building a largo plazo.

¡No te lo pierdas, será divertido! Asegúrese de seguirme aquí en Medium o en cualquier canal a continuación para recibir una notificación cuando se publiquen.

¡Hasta la proxima vez!

Antes de que te vayas

¡Aplauda 5, 15, 50 veces si disfrutaste lo que leíste!
Comentario ¡Me encantaría saber lo que piensas!
Sígueme Johan Belin aquí en Medium, o
Suscríbase a nuestro boletín haciendo clic aquí