sábado, 28 de septiembre de 2013

Análisis contra inducción


¿Empiezo por arriba o empiezo por abajo? ¿Empiezo desde la concepción del objetivo que quiero conseguir y voy desmenuzando el producto en sus partes constituyentes, o construyo partes autocontenidas que resuelven aspectos concretos y luego las combino para que de ahí emerja algo útil?
Podríamos denominar estos enfoques como enfoque analítico y enfoque inductivo, o constructivo. Ambos enfoques tienen hondas raíces en la ciencia, en la filosofía y en la ingeniería, y por supuesto no son excluyentes, aunque hay personas más bien analíticas y personas más bien constructivistas.
En programación de ordenadores se dan los dos estilos. En el analítico, uno debe empezar con una idea precisa del producto que quiere desarrollar y a partir de ahí analizar qué componentes debe tener, diseñar cada componente y finalmente codificarlo en un lenguaje de programación. Esto es útil cuando se conoce bien lo que se quiere hacer, por ejemplo, en un programa de contabilidad o una gestión de almacén. Hay poco que inventar en este tipo de programas, y uno conoce perfectamente los problemas generales que debe resolver el programa. En el constructivo o inductivo, se desarrollan pequeños componentes que resuelven problemas concretos, por ejemplo ordenar una lista de cosas, o relacionar una entrada con una salida, y a partir de ahí ensambla componentes para construir componentes más complejos, que quizá resuelvan tareas prácticas. La utilidad viene luego. Un ejemplo paradigmático es twitter: ¿qué utilidad puede tener un sistema que permite a la gente publicar textos de 140 caracteres?
Parece evidente que en el terreno de la Ingeniería del Software es más apropiado el enfoque analítico, porque lo usual es que haya un cliente que pide al ingeniero que le resuelva un problema específico, que (normalmente) el cliente conoce muy bien. Por ello hay un primera fase de especificación de requisitos, en la que se recogen en un documento los aspectos que debería incorporar el programa final.
Pero en el terreno de la Investigación el enfoque analítico sirve de muy poco, porque en muchos casos ni siquiera se sabe qué es lo que se quiere construir, así que se crean módulos que resuelven pequeños problemas con la esperanza de que al combinarlos se produzca algo más complejo que signifique un avance tecnológico.
En el campo concreto de la Inteligencia Artificial también coexisten enfoques analíticos e inductivos. En el área de los Sistemas Expertos, por ejemplo, se suele modelar el razonamiento de los expertos en el dominio de conocimiento en el que debe trabajar el sistema, y luego se formaliza este conocimiento en modelos (normalmente lógico-deductivos) que ya en fase de explotación son capaces de tomar decisiones.
Siempre me han atraído más, sin embargo, los sistemas inductivos: Redes de Neuronas Artificiales, Computación Evolutiva, Aprendizaje Bayesiano… Estos sistemas observan datos obtenidos de procesos reales y aprenden a relacionarlos entre sí, construyendo modelos –muchas veces en forma de números– del conocimiento de utilizarán luego, en fase de explotación, para la toma de decisiones.
El cerebro humano, desde luego, es capaz de funcionar en estos dos estilos, e incluso de encontrar el terreno común en el que puedan interactuar lo que viene de arriba, del análisis, con lo que viene de abajo, de la inducción –o la intuición, como la llamamos los humanos– de modo que el milagro se produce (cuando se produce1) en el campo de encuentro entre la una y la otra.
1 Vale, no voy a aprovechar para meterme otra vez con los políticos.
Publicado originariamente en Computación creativa y otros sueños (Libro de Notas) el 25/4/2012.