Sistema de Ayuda Inteligente al Diseño

Coautor con José Cuena de «Sistema de ayuda inteligente al diseño», publicado en Contributes Papers of the International Conference on Artificial Intelligence, II World Basque Congress, que se celebró en San Sebastián del 31 de agosto al 22 de octubre de 1987.

Allí expuse el sistema de ayuda al diseño de estructuras creado en mi proyecto de fin de carrera. Cuando escribí mi proyecto no disponía de un buen procesador de textos (WordPerfect 1.0 empezó a popularizarse hacia finales de los ochenta y yo no lo tenía), por lo que para poder hacer la memoria del proyecto tuve que construirme mi propio procesador de textos (del que yo fui su único usuario) junto con un módulo gráfico para que el Sistema de Ayuda Inteligente al Diseño pudiera imprimir gráficamente las estructuras que él creaba. Años después, me plantee que dicho procesador de textos y el módulo gráfico de impresión, valían, como proyecto de fin de carrera, mucho más que el propio proyecto presentado. Sin embargo, este artículo ya estaba escrito con el procesador de textos de un Apple Macintosh.

Sistema de Ayuda Inteligente al Diseño, 2º Congreso Mundial Vasco
  • Coauthor of «Intelligent computer-aided design», Contributes Papers of the International Conference on Artificial Intelligence, II World Basque Congress, Donosti, September of 1987.
  • Coautor de «Sistema de ayuda inteligente al diseño», Documentos de la Conferencia Internacional en Inteligencia Artificial, 2º Congreso Mundial Vasco, San Sebastián, septiembre de 1987.

Licenciado en informática, UPM

Comencé estos estudios en septiembre de 1981, terminé los 5 cursos en junio de 1986 y presenté el proyecto de fin de carrera en 1987. Mi forma de recordar lo que cursé cada año es gracias a la coincidencia entre el curso y las unidades de la década de los 80, estos es, en 1981 entré en 1º de carrera, en 1982 pasé a 2º, en 1983 inicié 3º, en 1984 comencé 4º y, finalmente, en 1985 llegué a 5º que era el último curso de la carrera. Durante esos 5 años cursé las siguientes materias:

Licenciado en informática, Universidad Politécnica de Madrid
  • Primer curso, 1981-1982: Álgebra Lineal, Cálculo Infinitesimal, Física, Química y Dibujo Técnico. También cursé y aprobé Inglés I que era de 3º de carrera e Inglés II que era de 4º de carrera, por lo que al llegar al verano podía afirmar que no sólo había aprobado todo 1º sino que además una de 3º y otra de 4º.
  • Segundo curso, 1982-1983: Análisis Matemático, Teoría de Circuitos y Electrónica Básica, Programación, Lógica Formal e Informática Básica.
  • Tercer curso, 1983-1984: Análisis Numérico, Circuitos Lógicos Electrónicos, Informática Teórica, Probabilidades y Estadística, Investigación Operativa I y Teoría de Sistemas. También había en 3º una asignatura llamada Inglés I que cursé en 1º.
  • Cuarto curso, 1984-1985: Centros de Proceso de Datos, Traductores e Intérpretes, Inteligencia Artificial y Reconocimiento de Formas, Arquitectura de Ordenadores, Investigación Operativa II y Sistemas de Información I. También había en 4º una asignatura llamada Inglés II que cursé en 1º.
  • Quinto curso, 1985-1986: Teleinformática, Computadores Analógicos e Híbridos, Sistemas Operativos, Bases de Datos, Economía y Organización de Empresas y Sistemas de Información II. Con 3 notables, 1 sobresaliente y 2 matrículas de honor, 5º fue mi mejor curso, porque había ido aprendiendo, año a año, cómo se cursa una carrera.

Tras terminar los 5 años de estudios comencé a trabajar y, en paralelo, realicé mi proyecto de fin de carrera que presenté en 1987 y que fue calificado con un 10 por su tribunal. En octubre de 2015, revisando y actualizando este post, me llevé la sopresa, al incluir la imagen que lo acompaña, que la calificación de este proyecto de fin de carrera había sido un 10, pues durante años lo que recordaba era que había sido un 9.

Como puede verse en el enlace con el que finaliza este post, la antigua Facultad de Informática de la UPM, en la que estudié, se llama ahora Escuela Técnica Superior de Ingenieros Informáticos. Sin embargo, sigue conservando sus siglas originales en el subdominio de la Universidad Politécnica de Madrid fi.upm.es.

  • Master's Degree in Computer Science (EQF Level 7), School of Computer Science, Technical University, Madrid, 5+1 years, 1981-1986, and 1987.
  • Licenciado en Informática (Nivel MECES 3 / Máster), Facultad de Informática, Universidad Politécnica, Madrid, 5+1 años, 1981-1986 y 1987.

3º de la 7ª promoción de la Facultad de Informática, UPM

Número 3º de la 7ª promoción de la Facultad de Informática, UPM
  • Number 3 in the Seventh Graduating Class of the 1986/87 academic year from the School of Computer Science, Polytechnic University of Madrid, 1987.
  • Número 3º de la Séptima Promoción del curso académico 86/87 de la Facultad de Informática, Universidad Politécnica de Madrid, 1987.

Instrumentación de la Inteligencia Artificial: PROLOG II

Logotipo de la AEPIA en 1986, Asociación Española para la Inteligencia Artificial
  • Coauthor of «Instrumentation of Artificial Intelligence: PROLOG II», AEPIA technical meeting, Madrid, December of 1985, AEPIA Bulletin, Spring-Summer 1986, Madrid, 1986.
  • Coautor de «Instrumentación de la Inteligencia Artificial: PROLOG II», Reunión técnica de la AEPIA, Madrid, diciembre de 1985, Boletín de la AEPIA, Primavera-Verano 1986, Madrid, 1986

Diseño y fabricación asistida por computador

Como administrador del centro de diseño y manufacturación asistida por ordenador (CAD/CAM) del Departamento de Investigación y Desarrollo de AMPER, S.A., durante 18 meses me encargué de la organización del centro y la definición de sus procesos y procedimientos, de la creación y administración de la base de datos gráfica de componentes electrónicos y del desarrollo de las aplicaciones para su consulta distribuida y de la implantación y automatización de los proceso para fabricación, incluyendo el trazado fotográfico, el taladrado industrial, el corte de placas, la inserción automática de componentes electrónicos, etc.

Entre otros muchos, desarrolle un programa que, a su vez, creaba programas de taladrado para taladradoras TRUDRIL, estos programas de taladrado se escribían en cinta de papel perforado, 6 bits por línea, unos y ceros, perforado o no perforado. Antes de enviarlas a fábrica, me sentaba en un taburete, y me leía estas cintas con todas sus líneas de perforaciones completamente, comprobando que eran correctas y que el programa creado automáticamente tenía sentido. Esta pudo ser una de mis primeras incursiones en la metaprogramación.

  • Manager of the Computer-aided Design and Manufacturing Group in Amper (electronic industry), Madrid, 1986-1987.
  • Administrador del Centro de Diseño y fabricación asistida por computador en Amper (sector de la electrónica), Madrid, 1986-1987.

Tesis de Francisco Javier Gisbert Cantó

Francisco Javier Gisbert Cantó es (2011) Vicedecano Secretario de la Facultad de Informática de la Universidad Politécnica de Madrid (UPM). Presentó su tesis doctoral titulada «Contribución para una nueva generación de sistemas de diseño asistido por computador basados en inteligencia artificial» en 1986. Con Ana García Serrano y Rafael María Gosálbez colaboré en esta tesis que dirigió mi director José Cuena.

Tesis de Francisco Javier Gisbert Cantó, portada y agradecimientos
  • Cited by Francisco Javier Gisbert as collaborator in his doctoral thesis about «Intelligent computer-aided design systems», page V, Technical University, Madrid, 1986.
  • Citado por Francisco Javier Gisbert como colaborador en su tesis doctoral sobre «Sistemas de ayuda inteligente al diseño», página V, Universidad Politécnica, Madrid, 1986.

Lenguaje Prolog, AEPIA

Rectorado de la Universidad Politécnica de Madrid

Jesús García San Luis y yo colaboramos con nuestra tutora Ana María García Serrano en la preparación y presentación de la ponencia denominada «Prolog II» en las Jornadas de Inteligencia Artificial de la Asociación Española Para la Inteligencia Artificial (AEPIA), que se celebró en 1985, en el Rectorado de la Universidad Politécnica de Madrid (UPM).

Ana María García Serrano es (2008) profesora asociada del Departamento de Inteligencia Artificial de la Facultad de Informática de la UPM y Jesús García San Luis es (2008) Director de Exploración y Producción I+D de Repsol.

El Rectorado de la UPM está en la calle Ramiro de Maeztu, en la Ciudad Universitaria, allí también pasé ese verano trabajando como becario, donde disponía de una máquina Digital Vax, a veces para mí solo, cuando en la Facultad, en los inviernos anteriores, había que hacer largas colas a primera hora de la mañana para conseguir sólo un poco de tiempo en otro Digital Vax de menor potencia.

  • Coauthor of «Prolog II language», Artificial Intelligence Symposium, AEPIA, Madrid, 1985.
  • Coautor de «Lenguaje Prolog II», Jornadas de Inteligencia Artificial, AEPIA, Madrid, 1985.

Riesgos de crédito para el Banco de Santander

Como becario trabaje en el desarrollo en Prolog II de un sistema experto de la clase MYCIN para la evaluación del riesgos de crédito para el Banco de Santander, en el área de créditos a empresas. La beca estaba dentro del marco de colaboración entre el Banco de Santander y el grupo de investigación creado por José Cuena en la Universidad Politécnica de Madrid (UPM).

Prolog es un lenguaje de programación lógico e interpretado con un mecanismo de inferencia mediante encadenamiento en profundidad de reglas. Por estas fechas, al poco tiempo de aprender a programar en Prolog (en especial Prolog II de Marsella), cree dos reglas capaces de procesar a otro conjunto de reglas, que recibían como argumentos de entrada, pero lo hice de forma que la exploración de dicho conjunto de reglas realizaba en anchura, no en profundidad. Mi director José Cuena me dijo divertido: «le dejo un motor de inferencia y lo primero que hace usted es cambiarle la dirección». Aquellas dos reglas ayudaron a la creación de sistemas expertos de acumulación y transmisión de evidencia (del tipo MYCIN, con una orientación semibayesiana) a partir de los a priori de los expertos, ya que la acumulación de la evidencia aportada por un conjunto de reglas necesita su evaluación conjunta, esto es en anchura, para poder ser combinada.

Logotipo del Banco de Santander de 1986 a 1989 en uso durante la realización de este proyecto
  • Intern in «Risk assessment expert system», Santander Bank, Madrid, 1985-1986.
  • Becario en «Sistema experto de evaluación de riesgos», Banco de Santander, Madrid, 1985-1986.

Tendencias y perspectivas científicas de la informática

Universidad Internacional Menéndez Pelayo, Palacio de la Magdalena, Santander, Cantabria
  • «Course on Trends and Scientific Perspectives of Informatics», Menéndez Pelayo International University, UIMP, Santander, June of 1984.
  • «Curso de Tendencias y Perspectivas Científicas de la Informática», Universidad Internacional Menéndez Pelayo, UIMP, Santander, junio de 1984.

Miembro del primer claustro democrático y constituyente de la UPM

Universidad Politécnica de Madrid, mi interpretación de su escudo

Fui miembro de la primer claustro democrático y constituyente de la Universidad Politécnica de Madrid y participé en la redacción de sus primeros estatus democráticos (aprobados por Real Decreto 2.536/1985, de 27 de diciembre).

  • Students' representative in the Legislative Congress of the Technical University, Madrid, 1984-1985.
  • Miembro del primer claustro democrático y constituyente de la Universidad Politécnica, Madrid, 1984-1985.

Claustral de la Facultad de Informática

  • Students' representative in the Council of the School of Computer Science, Technical University, Madrid, 1983-1984.
  • Miembro del claustro de la Facultad de Informática, Universidad Politécnica, Madrid, 1983-1984.

Delegado de 3º de la Facultad de Informática

  • Students' representative of the third course of the School of Computer Science, Technical University, Madrid, 1983-1984.
  • Delegado del curso 3º de la Facultad de Informática, Universidad Politécnica, Madrid, 1983-1984.

Sistema operativo RPS, Series/1 de IBM

Detalle del Series/1 de IBM con sistema operativo RPS

En 1983 colaboré como profesor ayudante de prácticas del Sistema operativo RPS (Real-time Programming System) del Series/1 de IBM, en el Centro de Cálculo de la Facultad de Informática, de la Universidad Politécnica de Madrid (UPM), bajo la dirección de Arturo Ribagorda Garnacho.

Arturo Ribagorda Garnacho es, actualmente (2010), Catedrático de Ciencia de la Computación e Inteligencia Artificial en la Universidad Carlos III de Madrid (UC3M) en el Campus de Leganés.

Por aquel entonces empezaba a utilizar discos flexibles de 8 pulgadas como el que aparece en la imagen, aunque todavía no habían salido de mí vida ni la programación ni con cinta, ni con tarjetas perforadas.

  • Assistant teacher of «IBM Series/1 RPS operating system», Computer Science School, Technical University, Madrid, 1983.
  • Profesor ayudante de «Sistema operativo RPS, Series/1 de IBM», Facultad de Informática, Universidad Politécnica, Madrid, 1983.

pAIr coding and AId coding versus vibe coding

A reflection on AI-assisted development, intelligent agents and ethics

In pAIr coding the AI is the driver and the human is the navigator. The human navigator should focus on the architectural design, the modular structure, the strategic direction, problem anticipation, edge cases, and systematic testing. And often to hold back the programming eagerness of the AI driver, who wants to start generating code at full speed. The AI driver's goal is to code at full speed, detect the errors pointed out by the human navigator, and follow their instructions.

The speed of pAIr coding can be x50 of human pair programming. Unlike human pair programming there is no role switching in pAIr coding. A x50 speed with role switching would be brain draining for the human navigator because the AI driver generates code at a dizzying speed. Then it is good for pAIr coding projects that the human navigator mixes the project with other different activities. My x50 speed measurement already includes the delays from this recommended mix for the human navigator. Without human fatigue the speed could be x100.

Vibe coding could be more relaxing for the human at the beginning but could lead to human desperation at the end. Then vibe coding is for small or one-use software, and pAIr coding for big and important software.

But if you lack experience in code development then vibe coding is the only alternative since you cannot act as navigator.

Vibe coding is sprint-and-stall coding, very fast at the beginning and the speed decreases with size, like programming in Excel: very fast for tiny projects and a nightmare with the spreadsheet two years later. And unlike vaporware, sprint-and-stall coding does leave something behind: twenty interconnected Excel sheets that nobody dares to touch, just poking cells to see if it still works.

pAIr coding is steady coding, slower than sprint-and-stall vibe coding in the first week but faster in the next months, with the speed gap growing each month.

pAIr coding versus vibe coding

Use vibe coding or pAIr coding depending on the size and criticality of the project. The smaller and less critical, the more vibe coding. The bigger and more critical, the more pAIr coding. But if you lack the experience and technical knowledge to perform well your role as human navigator then use vibe coding.

For example, when developing code for computing forensics tests, short and quick code for tests that will most likely lead nowhere, use vibe coding. But when one of those tests yields results, switch to pAIr coding so the resulting code is clear, precise, objective and can be delivered to the parties for their verification.

In vibe coding you can get results at the first prompt. In pAIr coding you can spend the first day or two in interaction with the AI defining the initial approach, requirements, specifications, definitions, modules, code organisation, language selection, programming style samples, the way the AI should write comments, and how the AI itself must write auditable code so the human navigator can verify that the AI is doing exactly what was asked.

And during all that time the AI will ask you eagerly every other moment if it can start coding now.

There is a third way: AId coding. The human does most of the work, designs, codes, comments and tests, but calls the AI for those pieces of special difficulty, not so much for their algorithmic complexity but for their technical requirements. A regular expression, a specific API call, a cryptographic routine, a parsing edge case. The roles are reversed compared to pAIr coding: here the human is the developer and the AI is the guru. The human assembles the final result.

A clear example is any development delivered to a client who will review and audit every line of code. The human developer owns the full codebase and is responsible for it. But when one specific piece requires deep technical expertise outside the developer's comfort zone, whether cryptographic handshaking, a complex regular expression, a low level system call or a specific protocol implementation, the AId of an AI can save the entire development.

Finally there is an idea that deserves its own article. The extreme case of vibe coding is building intelligent agents that invoke AI at runtime for each decision. The pAIr coding approach is the opposite: using AI to build intelligent agents whose logic is already hardcoded, programmed, wired into the code. When the agent makes a mistake you can find the reason and reprogram it. No hallucinations, no model changes, no unsettling surprises at 3am. Curiously I have been unable to build intelligent agents the first way. They always come out the second way. Maybe it is about prudence, explainability, supervision and error correction. And when the agent's activity affects people, ethics.

pAIr coding y AId coding frente a vibe coding

Una reflexión sobre el desarrollo asistido por IA, los agentes inteligentes y la ética

En el pAIr coding la IA es el driver y el humano es el navegador. El navegador humano se centra en el diseño arquitectónico, la estructura modular, la dirección estratégica, la anticipación de problemas, los casos límite y los tests sistemáticos. Y a menudo frenar el ansia de programación del IA driver que quiere ponerse a generar código a toda velocidad. El objetivo del AI driver es programar a toda velocidad, detectar los errores que le señala el navegador humano y seguir sus instrucciones.

La velocidad del pAIr coding puede ser x50 respecto al pair programming humano y a diferencia de este en el pAIr coding no hay intercambio de roles. Una velocidad de x50 en el pAIr coding humano es agotador para el cerebro humano pues el AI driver genera código a una velocidad vertiginosa. Por eso conviene que el navegador humano mezcle el proyecto de pAIr coding con otras actividades diferentes. Mis medidas del x50 de velocidad ya incluyen los retrasos por esta mezcla recomendada para el navigator humano, si no se cansara el navigator humano la velocidad podría ser x100.

El vibe coding puede ser más relajante para el humano al principio, pero puede llevar a la desesperación al final. Por eso se usa vibe coding para software pequeño o de un solo uso, y pAIr coding para software grande e importante.

Pero si se carece de experiencia en el desarrollo de código entonces el vibe coding es la única alternativa pues no se puede ejercer de navigator.

El vibe coding es codificación sprint-and-stall, muy rápido al principio y la velocidad decrece con el tamaño, como programar en Excel: rapidísimo para proyectos pequeños y una pesadilla con la hoja de cálculo dos años después. Y a diferencia del vaporware, la codificación sprint-and-stall sí deja algo: veinte hojas Excel todas conectadas que nadie se atreve a tocar, solo tocando celdas a ver si sigue funcionando.

El pAIr coding es steady coding, más lento que el vibe coding sprint-and-stall la primera semana, pero más rápido en los meses siguientes, con la diferencia de velocidad creciendo cada mes.

pAIr coding frente a vibe coding

Usa vibe coding o pAIr coding dependiendo del tamaño y criticidad del proyecto. A menor tamaño y criticidad, más vibe coding. A mayor tamaño y criticidad, más pAIr coding. Pero si no tienes ni experiencia ni conocimientos técnicos para ejercer bien tu rol de navigator humano entonces usa vibe coding.

Por ejemplo, cuando se está desarrollando código para realizar pruebas en computing forensics, código corto y rápido para tests que lo más probable es que no conduzcan a ningún sitio, usa vibe coding. Pero cuando uno de esos tests da resultados entonces conmuta al pAIr coding para que el código resultante sea claro, preciso, objetivo y pueda entregarse a las partes para que realicen las comprobaciones que procedan.

En el vibe coding puedes tener resultados al primer prompt. En el pAIr coding puedes pasarte el primer día o los dos primeros días en interacción con la IA definiendo el enfoque inicial, los requerimientos, especificaciones, definiciones, módulos, organización del código, selección del lenguaje, muestras de estilo de programación, la forma en que la IA ha de escribir los comentarios, y cómo la propia IA ha de escribir código auditable para que el navigator humano pueda verificar que la IA está haciendo exactamente lo que se le ha pedido.

Y durante todo ese tiempo la IA te preguntará con ansia cada dos por tres si ya se puede poner a programar.

Hay una tercera vía: el AId coding. El humano hace la mayor parte del trabajo, diseña, programa, comenta y prueba, pero utiliza la IA para programar aquellas piezas de especial dificultad, no tanto por su complejidad algorítmica sino por sus requerimientos técnicos. Una expresión regular, una llamada específica a una API, una rutina criptográfica, un caso límite de parsing. Los roles están intercambiados respecto al pAIr coding: aquí el humano es el desarrollador y la IA es el guru. El humano ensambla el resultado final.

Un ejemplo claro es cualquier desarrollo entregado a un cliente que va a revisar y auditar cada línea de código. El desarrollador humano es dueño del código completo y responsable de él. Pero cuando una pieza concreta requiere una experiencia técnica profunda fuera de su zona de confort, ya sea un handshaking criptográfico, una expresión regular compleja, una llamada de bajo nivel al sistema o la implementación de un protocolo específico, el AId de una IA puede salvar el desarrollo entero.

Finalmente hay una idea que merece su propio artículo. El caso extremo del vibe coding es construir agentes inteligentes que invocan a la IA en tiempo de ejecución para cada decisión. El enfoque pAIr coding es el contrario: usar la IA para construir agentes inteligentes cuya lógica ya está hardcodeada, programada, cableada en el código. Cuando el agente se equivoca puedes ir a buscar la razón y reprogramarlo. Sin alucinaciones, sin cambios de modelo, sin sorpresas preocupantes a las 3 de la mañana. Curiosamente he sido incapaz de programar agentes inteligentes de la primera forma. Siempre me salen de la segunda. Puede que sea cuestión de prudencia, capacidad explicativa, supervisión y corrección de errores. Y cuando la actividad del agente afecta a personas, de ética.