4 puntos por GN⁺ 2024-11-17 | 1 comentarios | Compartir por WhatsApp
  • A partir de un libro que le prestó a un estudiante como lectura de verano, Simon Dobson vuelve a confirmar que SICP es el libro de ciencias de la computación que más influyó en su carrera y en sus intereses de investigación
  • A diferencia de la enseñanza introductoria centrada en Pascal, este libro parte de valores, nombres, enlaces y control para mostrar lo que la programación puede llegar a ser
  • Conecta dentro de Scheme la abstracción lambda, la computación de orden superior, streams, evaluación diferida, intérpretes y compiladores, recolección de basura, memoria virtual, lenguaje de máquina y hasta lenguajes específicos de dominio
  • Su mayor influencia está en el diseño estratificado, que construye sistemas complejos como múltiples capas de lenguajes, y en una visión de las ciencias de la computación como disciplina del “cómo hacerlo” más que del “qué es”
  • El libro que compró en 1988 todavía valía la pena releerse de forma práctica en 2010, y SICP sigue siendo una obra fundamental duradera en ciencias de la computación

Primer encuentro con SICP

  • Después de prestarle a un estudiante Structure and Interpretation of Computer Programs como lectura para el verano, Simon Dobson recordó que este libro es, para él, una de las obras más fundamentales de toda la ciencia de la computación
  • Su título formal es Structure and Interpretation of Computer Programs, de Hal Abelson y Jerry Sussman; fue publicado por MIT Press en 1984 y también se lo conoce como SICP
  • El libro sigue en publicación y está disponible completo en línea
  • Dobson conoció el libro como texto recomendado después de terminar su primer curso de programación en el segundo año de su primera carrera en Newcastle upon Tyne
  • Para él, que en ese momento intentaba encontrar su camino en ciencias de la computación, SICP no mostraba “la programación de entonces”, representada por Pascal, sino las formas posibles de la programación

Conceptos construidos dentro de Scheme

  • SICP comienza con los elementos básicos de la programación —valores, nombres, enlaces y control— y se expande hacia una amplia variedad de temas
    • abstracción lambda y computación de orden superior
    • estructuras de datos complejas que contienen computación
    • modularidad y mutabilidad
    • streams
    • evaluación diferida
    • construcción de intérpretes y compiladores
    • gestión de almacenamiento, recolección de basura y memoria virtual
    • lenguaje de máquina
    • lenguajes específicos de dominio
  • El alcance de los temas es desconcertantemente amplio, pero la escritura y la estructura de los autores mantienen la coherencia
  • En particular, todos los conceptos se tratan dentro de un único marco de lenguaje, Scheme, y cada idea nueva se construye sobre lo aprendido antes

Diseño de programas visto como diseño de lenguajes

  • La segunda característica de SICP que tuvo un gran impacto es que Hal Abelson y Jerry Sussman ven todo como un ejercicio de diseño de lenguajes
  • El libro enfatiza el diseño estratificado, que organiza sistemas complejos como lenguajes en múltiples niveles
    • Cada nivel se construye combinando componentes considerados primitivos en ese nivel
    • Los componentes creados en un nivel se usan como elementos primitivos del siguiente
    • El lenguaje de cada nivel tiene elementos primitivos, medios de combinación y medios de abstracción adecuados para ese nivel de detalle
  • La abstracción jerárquica en sí misma es familiar para los científicos de la computación, pero la diferencia importante aquí es la perspectiva de que cada capa debe ser programable
  • Desde este punto de vista, una capa no es simplemente un dispositivo para ocultar información, sino un medio para manejar cómputo y transformación
  • En los lenguajes de programación dominantes, esta estratificación difícilmente se traduce en una extensión del propio lenguaje
    • Java es Java de arriba abajo; tiene clases y bibliotecas, pero no nuevas estructuras de control
    • Aunque en un dominio específico sean útiles estructuras de lenguaje dedicadas, no es fácil agregarlas dentro del lenguaje
    • A la inversa, aunque se quiera impedir el uso de cierta estructura en algún dominio, no se puede eliminar dentro del lenguaje
    • Java-ME quitó algunas funciones para ejecutarse en dispositivos pequeños, pero no es algo que pueda hacerse sin reescribir el compilador

Más que “qué es”, “cómo hacerlo”

  • La tercera influencia importante es la visión de SICP sobre qué trata realmente la ciencia de la computación
  • SICP ve la revolución informática como una revolución en la forma de pensar y en la forma de expresar el pensamiento
  • El libro lo explica como epistemología procedural (procedural epistemology)
    • Si las matemáticas clásicas ofrecen un marco para tratar con precisión el “qué es”
    • La computación ofrece un marco para tratar con precisión el “cómo hacerlo”
  • Dobson ha adoptado la perspectiva de que la computadora es como un nuevo microscopio: ayuda a los enfoques existentes y, al mismo tiempo, abre nuevas ciencias
  • Este aspecto de la ciencia de la computación como “cómo hacerlo” reaparece en varios ámbitos
    • Describir el funcionamiento de redes de sensores capaces de adaptarse mientras reflejan continuamente los fenómenos desplegados
    • Interpretar datos masivos extraídos y combinados a lo largo de la web
    • Capturar métodos y procesos científicos para automatizarlos
  • La riqueza de estos ámbitos fomenta la integración mediante lenguajes de programación más que mediante software empaquetado, y permite mantener interfaces y estructuras flexibles y experimentables con lenguajes como R

Por qué un libro viejo sigue leyéndose

  • En el interior del libro de Dobson estaba anotada la fecha de compra, septiembre de 1988, y para 2010 el libro, de casi 22 años, seguía siendo relevante
  • Él considera que SICP es casi el único libro de ciencias de la computación de esa edad que puede releerse con utilidad, y no solo por interés histórico
  • En los libros de matemáticas no es raro encontrar contenidos duraderos, pero en ciencias de la computación, donde las ideas se mueven rápido y abundan los temas pasajeros, es algo difícil de ver
  • El hecho de que el contenido de SICP casi no haya envejecido muestra que el libro capturó bien los conceptos centrales de la ciencia de la computación
  • Por estas razones, SICP es uno de los pocos libros de ciencias de la computación que vale la pena leer más de una vez, y se lo valora como un libro que, al igual que Lectures on Physics de Feynman en física, destila de forma accesible la esencia de su campo y ha resistido la prueba del tiempo
  • En una actualización del 27 de enero de 2024, este libro también figura como Structure and interpretation of computer programs en la annotated Lisp bibliography

1 comentarios

 
GN⁺ 2024-11-17
Opiniones de Hacker News
  • Los “clásicos” como SICP hablan de diseño de programas, pero hoy el diseño de sistemas parece una habilidad mucho más importante
    No sé si los sistemas distribuidos entran dentro de la “ciencia de la computación”, pero en la práctica son problemas que hay que resolver con más frecuencia
    Suelo hacer los sistemas lo más simples posible, usar herramientas de observabilidad para encontrar dónde falta diseño y, cuando hace falta, sacar estructuras de datos o soluciones más “de ciencia de la computación”
    En la mayoría de los casos, la notación Big O y la complejidad de tiempo de ejecución no importan, y se pueden resolver muchos problemas con arreglos y CPUs rápidas
    Incluso cuando aparecen problemas de rendimiento, primero hay que hacer profiling para encontrar el cuello de botella
    La ciencia de la computación no enseña bien cómo funciona la caché de memoria de la CPU
    Un algoritmo de grafos sofisticado puede tener mejor complejidad de tiempo de ejecución, pero arruinar la caché de la CPU y terminar siendo más lento que un arreglo que aprovecha bien la caché
    En la práctica, los problemas más comunes son lidiar con tolerancia a fallas, la corrección de locks y colas distribuidas, y la escalabilidad de sistemas
    Puede que tenga un sesgo porque vengo de una formación en computación/ingeniería eléctrica

    • Para diseñar sistemas hay que tener una perspectiva de implementación, así que aunque subas en la cadena de valor para hacer diseño, no puedes saltarte la experiencia de abajo
      Aprendí sobre la caché de memoria de la CPU hace 30 años, en el primer semestre de la licenciatura en CS, con el libro de Hennessy y Patterson, y entiendo que todavía se usa
      La tolerancia a fallas, la corrección de locks y colas distribuidas, y la escalabilidad de sistemas también se veían en CS de pregrado, y no era una formación especial de computación/ingeniería eléctrica
    • CS y el desarrollo de software en la industria han cambiado un poco
      Todavía hay trabajo creando frameworks, motores de bases de datos y herramientas de control de versiones, y ese tipo de trabajo exige todos los días conocimientos profundos de CS como algoritmos y estructuras de datos
      Pero esos puestos son menos que antes, y para una app suele usarse Postgres en vez de implementar un motor de BD propio
      La mayor parte del trabajo es implementar lógica de negocio, y aunque saber cómo funciona internamente una base de datos ayuda a lograr mejores resultados, se puede construir mucho software funcional sin saber cómo se almacenan los índices en disco
      Muchos graduados de CS creen equivocadamente que su trabajo será escribir frameworks, cuando en realidad consiste en usar frameworks existentes e implementar lógica de negocio, entendiendo esos frameworks en profundidad gracias a su base de CS
    • Tradicionalmente, el campo de las bases de datos se enfoca mucho en resolver problemas algorítmicos al manejar datos mucho más grandes que no caben completos en memoria
      Los datos existen como “páginas” en el disco, y en la RAM hay una cantidad fija de “slots de página”
      Mover páginas entre el disco y la RAM es lento, así que hay que reducirlo al máximo
      Por eso incluso problemas que parecen triviales se vuelven interesantes. En la ciencia de la computación clásica no existe un concepto separado de “join”, porque no es lo suficientemente complejo como para ponerle nombre
      Es fácil pensar en la investigación de algoritmos como una esencia pura, pero también puede verse que la eficiencia algorítmica solo tiene sentido en el contexto de datos y hardware específicos
      Por eso el trabajo se vuelve interesante, y como no basta con aplicar librerías o soluciones de recetario en todas partes, la experiencia en algoritmos sigue siendo útil
    • Es cierto, pero creo que no solo los juniors, sino también programadores con mucha experiencia, suelen tener problemas en la codificación a nivel táctico
      Ahora estoy sufriendo con un componente en el que debo hacer un cambio pequeño: tiene demasiado estado innecesario y maneja dos abstracciones al mismo tiempo
      Procesa archivos y usa tanto el sistema de archivos como la base de datos para almacenar estado; me sorprendió lo mal diseñado que está
      Pasé varios días intentando evitar hacer lo de siempre: agregarle más cosas y volverlo todavía más difícil de entender
      Parece que la cultura de pull requests hizo que se aprobara cualquier basura sin tomarse el tiempo de pensar a fondo en el código real
      Ojalá volvieran las revisiones de código cara a cara
    • Me pregunto si viste Software Design for Flexibility: How to Avoid Programming Yourself into a Corner, de Chris Hanson y Gerald Jay Sussman
      Es un libro de 2021
  • El enlace a la copia gratuita del texto está roto
    https://mitp-content-server.mit.edu/books/content/sectbyfn/b...
    https://web.mit.edu/6.001/6.037/sicp.pdf
    Hasta hoy no había visto una versión PDF oficial
    Hacia 2001, solo la versión HTML era gratuita, y alguien la convirtió a TeXinfo: https://www.neilvandyke.org/sicp-texi/
    Si ahora quieres seguir SICP, puedes ejecutar el código en MIT Scheme o DrRacket: https://www.neilvandyke.org/racket/sicp/

    • Para quien quiera probar MIT Scheme, los mantenedores actuales ya no ofrecen un .dmg, pero se puede descargar y compilar la versión x86_64 de MIT Scheme
      La versión actual (v12.1) funciona en Macs con CPU Intel corriendo Sequoia, o en Apple silicon vía Rosetta
      Eso sí, el compilador de código nativo está algo roto, y probablemente no sea necesario para SICP
      Creo que funcionaba en macOS anteriores a Monterey, así que quizá cambió alguna dependencia provista por Apple, pero no lo investigué
      Si no necesitas sí o sí MIT Scheme y no quieres sufrir compilando, Racket podría ser una mejor opción
    • Como referencia, recomiendo seguirlo con Racket
      Tengo entendido que tiene un modo explícito para SICP
      Yo lo intenté con GNU Guile, pero había pequeñas diferencias de sintaxis entre Guile y MIT Scheme y fue bastante engorroso
    • Si quieres leerlo en el navegador, recuerdo que la versión TeXinfo fue la fuente de una versión HTML5 bastante agradable
      Tiene mejor formato que el original del MIT: https://sarabander.github.io/sicp/
    • Conviene saber que el “lenguaje de dibujo” del capítulo 2 no está soportado en MIT Scheme en 2024
      Antes había un paquete, pero lleva casi 20 años sin mantenimiento
      En cambio, DrRacket tiene un paquete específico para resolver esos problemas
    • DrRacket incluye SICP y HTDP como paquetes educativos
  • Se pueden ver las clases grabadas de 1986 donde Abelson y Sussman enseñan el contenido de este libro
    Su explicación de cómo crear y agrupar abstracciones en varias capas sigue siendo útil, tanto para mí como cuando hago mentoring
    En el video es la lesson 3A, en 1:07:55
    https://m.youtube.com/playlist?list=PLE18841CABEA24090

    • El chiste de la Kabbalah me hace reír cada vez
    • Al ver videos así, resulta curioso pensar que estas personas no tenían ni idea de lo que vendría en el futuro
  • The Elements of Programming Style vale la pena leerlo tres veces, y a mí me ha ayudado muchas más veces al releerlo
    Si te interesa, tengo una reseña que escribí en 2010: https://reprog.wordpress.com/2010/03/06/programming-books-pa...

    • Pensé que te referías a Elements of Programming, de Stepanov y McJones, y sinceramente a ese libro también le daría la misma recomendación y valoración
      https://elementsofprogramming.com/
  • La parte de SICP que más me gusta y que recuerdo desde hace años es la idea de la programación desiderativa
    Es una forma de construir algo de arriba hacia abajo, deseando que las rutinas de bajo nivel ya existan
    Luego efectivamente creas esas rutinas de bajo nivel y bajas hasta el fondo
    Creo que esta forma de pensar encaja muy bien con el desarrollo guiado por pruebas
    Primero escribes pruebas para la funcionalidad que quisieras tener, y luego vas a satisfacer ese deseo
    Me parece que la mayoría de los desarrolladores construye de abajo hacia arriba y al final obtiene algo que nadie quería

    • La razón para hacerlo así es que se busca rendimiento y naturalidad
      Puedes terminar deseando por accidente algo cuya verdadera naturaleza aún no conoces, y entonces aparece un caos frágil en la base
      Eso suele pasar, porque la naturaleza algorítmica de las cosas rara vez es intuitiva
      Empezar desde abajo es como partir de los quarks que realmente tienes, no de “ojalá existiera la magia”
      No hay magia, y cuando llegas al fondo hay quarks en vez de partículas mágicas; además, en el proceso pierdes pistas de contexto que ayudarían a traducir entre ambas físicas
      Ambos enfoques son útiles. Para resolver problemas profundos, a veces hay que atreverse a desear
      Pero personalmente prefiero poner la magia en la capa inmediatamente debajo del nivel superior
      Es decir, construir de abajo hacia arriba y, justo antes de la lógica de negocio, crear una capa mágica de conveniencia que traduzca hacia y desde el lenguaje del negocio
      Así es ajustable y no crea un enredo acoplado hasta el fondo
    • El Dr. Donald Knuth usó casi ese enfoque al escribir TeX
      Primero escribió una forma de formato/etiquetado que parecía adecuada, luego concibió un modo de programación apropiado para el marcado —por eso, macros— y después pasó a la implementación
      Estoy intentando un enfoque parecido en mi trabajo para crear una biblioteca que modele G-code en OpenSCAD
      Hace poco la reescribí en OpenPythonSCAD “puro”, así que espero que se vuelva usable
    • El mundo Smalltalk apoya bien este enfoque con la práctica de programar dentro del depurador
      Vale la pena probar Pharo
  • SICP es el mejor libro para leer como primer libro al estudiar ciencias de la computación
    Después de programar como hobby durante varios años, leer libros sobre programación estructurada y conocer varios lenguajes desde Pascal hasta Common LISP, usé Abelson & Sussman en un curso de licenciatura en ciencias de la computación, y me abrió los ojos
    Al mostrar la simplicidad, la belleza y la interactividad de Scheme, enseña que la ciencia de la computación consiste en apilar, capa sobre capa, distintos tipos de abstracciones
    Empieza con la abstracción de procedimientos y la abstracción de datos, luego pasa a definir uno mismo lenguajes específicos de dominio e implementar sus compiladores, hasta llegar a definir nuevo hardware dentro del software
    Todo parece tan natural, y solo un verdadero maestro puede lograr que se vea así
    Eso sí, hay que comprar la 2.ª edición, no la 1.ª ni la más reciente
    La edición más reciente usa Python en lugar de Scheme, y no es muy buena

  • De verdad quería que SICP me encantara, pero Lisp me puso el pie
    Me gustan Haskell y Standard ML
    Me da curiosidad si a alguien más le pasó algo parecido
    Sería interesante que hubiera un libro con un espíritu similar al de SICP, pero que use otro lenguaje como medio
    No es que quiera hacer SICP en JavaScript

    • Tal vez te interese el texto de 1987 A Critique of Abelson and Sussman or Why Calculating is Better than Scheming: https://dl.acm.org/doi/10.1145/24697.24706
      El autor propone usar KRC o Miranda como alternativa a Scheme
      No conozco bien KRC, pero Miranda es un lenguaje de programación funcional con tipado estático que influyó en Haskell
    • SICP no es un libro sobre Lisp, pero usa propiedades únicas de Lisp para mostrar conceptos importantes que serían difíciles de reproducir en otros lenguajes
      Un libro parecido a SICP que no use Scheme ni Lisp sería totalmente distinto de SICP, o al menos no podría enseñar lo mismo
      En mi experiencia, Haskell y ML fueron mucho más difíciles de entender que Scheme, así que me da curiosidad qué parte te resulta difícil
    • De verdad quería que SICP me encantara, y si lo hubiera leído hace 15 años probablemente me habría gustado
      Empecé a leerlo el mes pasado y sentí que abarca demasiado
      Recorre demasiados principios matemáticos interesantes, y justo cuando se pone divertido pasa al siguiente tema
      Dicho de otro modo, es demasiado superficial
      Viéndolo en retrospectiva, tampoco ayudó que ya hubiera visto muchas clases y documentos derivados de SICP, así que cada vez que se presentaba un tema pensaba “otra vez esto”
    • Entiendo esa sensación. Lisp me alejó, y fue porque no era lo suficientemente inteligente
      Aun así me obligué a llegar hasta el final, y como no era lo bastante inteligente para manejar Lisp, terminé aprendiendo muchísimo
      Como pasé demasiado tiempo leyendo el código, siento que aprendí más de lo que habría aprendido con un lenguaje familiar
      También existe una versión de SICP en Python
      No la recomiendo, porque no la hice completa y solo la revisé por encima, pero dejo el enlace como prueba de que existe
      https://wizardforcel.gitbooks.io/sicp-in-python/content/0.ht...
    • Creo que Functional Programming in Scala, también conocido como Red Book of Scala, es un libro que enseña a pensar de la misma manera que SICP, pero usando un lenguaje tipado
      En mi librero, ambos libros están uno junto al otro, y sin duda vale la pena leerlos
  • La segunda vez que lo leí me metí a fondo con las notas al pie y las referencias, y ahí también había un mundo enorme y hermoso
    Si no recuerdo mal, hay un paper en el que Sussman y su equipo diseñaron un procesador programable a medida para calcular propiedades de cuerpos celestes, es decir, trayectorias
    Como siempre, es algo que te vuela la cabeza

  • SICP me ayudó a entender temprano que hay varios modelos de programación, cuando en la licenciatura solo había aprendido un número limitado de modelos
    Fue uno de esos libros que me dieron la sensación de que podría orientarme al leer la documentación de cualquier lenguaje, biblioteca o framework

    • Una de las mejores clases de programación que tomé en la universidad fue una materia de lenguajes de programación comparados, donde veíamos varios lenguajes durante unas dos semanas cada uno
  • Junto a SICP pondría también toda la serie The Little * como material que vale la pena leer más de una vez
    Types and Programming Languages también es bueno
    Es ciencia de la computación aplicable a lo que hago, pero no basta con leer: también hay que implementar
    Si no lo repites, olvidas parte de ello
    Personalmente, quizá porque lo conocía y lo respetaba, releo con bastante frecuencia los libros y papers de Dijkstra
    Hoy ya es difícil aplicarlos directamente, pero son buenos para el cerebro y, en lo personal, lo considero un gran escritor