Lo que voy a intentar describir a continuación es algo con lo que llevo conviviendo todos mis años de programador, y que no me he dado cuenta lo importante que era hasta hace unos meses, y son dos corrientes de programadores, o de programación, a las que he mal llamado programación filosófica y programación empírica, la verdad es que los términos no serían los más correctos pero me parecen los más descriptivos.
La primera forma de programar es la que he denominado "filosófica", en la cual me incluyo, o me incluía hasta hace poco. Esta coriente la llamo "filosófica" porque esta basada en el concepto básico de observación. Es decir si se ha de resolver un problema la solución es ver cual es, estudiarlo, dar una solución general que resuelva el problema, plantear los posibles errores del enfoque que se le ha dado, resolverlos y darlo como bueno y en algunos casos hasta como solución única e inamovible. Cuando se ha encontrado dicha solución general se lleva a cabo y en el caso de que falle o se encuentren errores, o incluso situaciones que el método general no resuelva, la solución no es arreglar o cambiar el sistema, sino parchear éste para que esos casos de uso entren dentro de la solución principal.
La otra corriente es la denominada "empírica", denominada así porque está basada en la experiencia y en la perfeción, centrándose en los problemas particulares, e incluso en algunos casos realizando cosas por repetición, que se han realizado siempre así y no se plantea nunca un cambio, este tipo de corriente fue bien descrita por mi compañero Martín; "es tirar el código y que funcione, porque y como no nos importa. Si funciona a la primera mejor". Este estilo de programación está bastante más extendida de lo que parece, fundamentada sobre todo por los tiempos que hay para desarrollar los proyectos.
Tanto un tipo de desarrollo como el otro tienen un problema, el mantenimiento de los proyectos o la extensión de los mismos. Ya que en el "filosófico" los remiendos que se van realizando al código lo pueden dejar ilegible e insostenible, mientras que "empírico" en la mayoría de las situaciones ya es insostenible de base, y modificar alguna cosa puede destrozarnos todo.
Estos últimos meses he conocido a una persona muy curiosa que se sale de estas dos grandes corrientes; mi colega Luis. No encaja en ninguna de estas corrientes, sino que podríamos decir que de alguna forma las auna en lo que he denominado "método científico", ya que tiene muchas silimitudes, con éste. Las fases que sigue normalmente para resolver un problema son las siguientes:
- Observación : Se observa el problema y se describe, se mira si existen problemas similares ya resueltos(a traves de patrones conocidos por ejemplo o a traves de experiencia previa).
- Inducción e hipótesis: Van cogidas de la mano, se crea un modelo teórico que resuelva el problema y se le pone a prueba de forma viendo los posibles casos de error
- Experimentación: Como dice Luis, "ninguna teoría funciona hasta que no se pone en práctica, y lo más probable es que en la práctica no fucione como la pensamos". Se resuelve el problema (se codifica) y se hacen pruebas sobre la teoría.
- Refutación o cambio de modelo: Si una vez llegado aqui vemos que el modelo que hemos creado en la hipótesis falla volvemos al punto 2, y modificamos el modelo, esto es bastante importante ya que la idea no es hacer un parche sino escontrar una solución general para nuestro problema. Si vemos que funciona ya tenemos nuestro problema solucionado.
Este sistema me parece bastante completo, incluso se puede dar el caso que en el futuro surjan nuevos problemas y que tengamos que cambiar el paradigma entero, decirle a tu jefe que lo mejor es cambiar un gran trozo de código parece jodido pero muchas veces si no realizas ese cambio empiezas a arrastrar problemas y terminas con un código inmanejable.
Para temirnar decir que no defiendo ninguna de estas teorías porque todas ellas en el fondo me parecen válidas en según que situaciones. Que cada uno saque sus conclusiones, esta es solo mi opinión y lo que he observado en el tiempo que llevo desarrollando.