![]() |
Hay algo de simple en lo complejo, así como hay algo de complejo en lo simple. |
La entrada de hoy va dedicada a un antiguo colaborador; gracias a él introduje este concepto en mi letanía al revisar los avances de mi equipo de trabajo.
Hoy nos centraremos en el principio KISS.
Kiss: acrónimo de Keep It Short and Simple.
Describir a lo que se refiere sería contradictorio al propio principio por lo que me limitaré a explicar por qué se hace bueno tener eso en mente al momento de construir un sistema de cómputo. A esto, la respuesta más simple es que las partes pequeña se controlan (y por lo mismo se mantienen y administran) mejor y más fácilmente que las partes grandes.
Esto debería ser simple; sin embargo he notado que existe una curiosa dificultad por estructurar una solución compleja como la suma de pequeñas soluciones sencillas y más pequeñas. Y muchas veces esto puede deberse a falta de experiencia, a falta de visión, de análisis, de abstracción o quizá sólo de experiencia, y por lo mismo se termina con una construcción mucho más compleja de lo que el problema realmente amerita.
Seamos honestos: como programadores muchas veces comenzamos a visualizar el código desde que se hace el primer planteamiento del problema y nos ganan las ansias de empezar a escribir lineas de ciclos y condiciones sin antes siquiera tener una visión completa del problema... Esta naturaleza nuestra es el peor enemigo y obstaculiza el análisis.
Sin más preámbulo, tomemos de ejemplo un fragmento de código con el que me tropecé hoy. El objetivo: detectar si entre un rango de fechas se encuentra o no un 29 de febrero. Estas fechas pueden pertenecer o no al mismo año, por lo que el problema se podría complicar... Un problema de este tipo podría resolverse de diferentes y muy variadas formas. Así pues, luego de haber superado el trauma de reescribir dicho fragmento de código -que además no cubría todos los casos por lo que generaba resultados erróneos- me dediqué a censar entre algunos colaboradores de qué manera lo habrían resuelto.
A continuación describiré algunas de las opciones de tan entretenido problema, que al igual que los acertijos, siempre son divertidos y simples cuando ya tienes al menos una respuesta.
- Versión 1 (la que se tuvo que corregir)
- identificar si la fecha de inicio es menor al primero de marzo
- en caso afirmativo verificar si el año de inicio es bisiesto
- verificar si el año de la fecha final es diferente al año de la fecha de inicio
- en caso afirmativo verificar si la fecha final es mayor al primero de marzo
- en caso afirmativo, verificar si el año de la fecha final es bisiesto
- si el año de inicio es mayor al primero de marzo y el año de la fecha de fin es mayor al año de la fecha de inicio recorrer desde la fecha de inicio hasta la fecha final
- para cada fecha entre el inicio y el final, si el mes es febrero y el primer día de marzo del año en curso menos un día es día 29 entonces sí hay una fecha 29 de febrero.
- La rutina para verificar si el año es bisiesto valida si el año es divisible entre 4 excepto si es divisible entre 100 pero no entre 400 (y este es otro tema del mismo debate)
- Versión 2 (que definitivamente tampoco funciona)
- verificar si el año de inicio es bisiesto
- verificar si el año final es bisiesto
- si la fecha de inicio es menor al primero de marzo y el año de inicio es bisiesto o si la fecha final es mayor al primero de marzo y el año final es bisiesto entonces hay sí hay un 29 de febrero.
- Versión 3 (Variación del anterior pero más enrevesada)
- recorrer cada año desde el año de inicio y el año final
- verificar si el año en curso es bisiesto
- si la fecha de inicio ajustada al año en curso es menor al primero de marzo y el año es bisiesto y la fecha final es mayor al primero de marzo del año en curso entonces sí hay un año bisiesto
- si la fecha de inicio ajustada al año en curso es mayor al primero de marzo y el año es bisiesto y el año de la fecha final es mayor al año de la fecha de inicio y el año de la fecha final es bisiesto entonces sí hay un un 29 de febrero .
- en cualquier otro caso no hay un 29 de febrero.
Podría continuar listando al menos otras 3 versiones distintas de esta implementación, pero nos desviaríamos del tema central.
Existe una gran contradicción a este principio y es justamente esto lo que nos convierte en buenos o malos programadores: Resulta demasiado complejo proponer una implementación simple.
La real complejidad de este principio radica en la habilidad de visualizar todas las partes del problema y ponerlas juntas, por lo que haré hincapié en la importancia de lo que ya algunos siglos atrás nos enseño el buen Napoleón: ¡Divide y vencerás!
Al final, sólo se trata de práctica; de no quedarte contento con haber encontrado una solución, sino de insistir en mejorarla, en optimizarla hasta estar seguro de que no puede ser mejor; y con esto me refiero a la elegancia del código, a la claridad con que se escribe, a la simpleza de su estructura, y más importante aún: a la eficiencia de cómputo.
Para terminar, sólo quiero agregar que la versión implementada se puede ver en un elegante y claro ciclo escrito en no más de 6 líneas de código con las condiciones de parada necesarias y suficientes para no procesar de más. ¡Ah! también hay que mencionar que mi acepción favorita del acrónimo de este principio es -sobre todo cuando es en alguna revisión-: Keep It Simple, Stupid!
Happy Codings!
Fué un poco más de lo que podría decir short pero interesante
ResponderEliminar