SICP: o único livro de ciência da computação que vale a pena ler duas vezes? (2010)
(simondobson.org)- Ao emprestar um livro a um aluno como leitura de verão, Simon Dobson reafirma que SICP é o livro de ciência da computação que mais influenciou sua carreira e seus interesses de pesquisa
- Diferentemente da educação introdutória centrada em Pascal, o livro parte de valores, nomes, vinculação e controle para mostrar o que a programação pode ser
- Conecta, dentro de Scheme, abstração lambda, computação de ordem superior, streams, avaliação preguiçosa, interpretadores e compiladores, coleta de lixo, memória virtual, linguagem de máquina e até linguagens específicas de domínio
- Sua maior influência está no projeto em camadas de construir sistemas complexos com vários níveis de linguagem e na visão da ciência da computação como uma disciplina menos sobre “o que é” e mais sobre “como fazer”
- Comprado em 1988, o livro ainda valia a pena ser relido de forma prática em 2010, e SICP continua sendo uma obra fundamental duradoura da ciência da computação
Primeiro encontro com SICP
- Depois de emprestar Structure and Interpretation of Computer Programs a um aluno como leitura para o verão, Simon Dobson relembra que este livro é, para ele, a obra mais fundamental de toda a ciência da computação
- O título completo é Structure and Interpretation of Computer Programs, de Hal Abelson e Jerry Sussman, publicado pela MIT Press em 1984 e também conhecido como SICP
- O livro continua em publicação, e está disponível integralmente online
- Dobson conheceu o livro como leitura recomendada depois de concluir seu primeiro curso de programação, no segundo ano de sua primeira graduação em Newcastle upon Tyne
- Para alguém que ainda procurava seu caminho na ciência da computação, SICP mostrou não “a programação daquela época”, representada por Pascal, mas as formas de programação que eram possíveis
Conceitos construídos dentro de Scheme
- SICP começa com os elementos básicos da programação — valores, nomes, vinculação e controle — e se expande para uma ampla gama de temas
- abstração lambda e computação de ordem superior
- estruturas de dados complexas que incorporam conteúdo computacional
- modularidade e mutabilidade
- streams
- avaliação preguiçosa
- construção de interpretadores e compiladores
- gerenciamento de armazenamento, coleta de lixo e memória virtual
- linguagem de máquina
- linguagens específicas de domínio
- O escopo abordado é surpreendentemente amplo, mas mantém a coerência graças à escrita e à organização dos autores
- Em especial, todos os conceitos são tratados dentro de uma única estrutura de linguagem, o Scheme, e cada novo conceito é construído sobre o que foi aprendido antes
Projeto de programas visto como projeto de linguagem
- A segunda característica de SICP que teve grande influência é que Hal Abelson e Jerry Sussman veem tudo como um exercício de projeto de linguagem
- O livro enfatiza o projeto em camadas de construir sistemas complexos por meio de vários níveis de linguagem
- Cada nível é construído combinando componentes considerados primitivos naquele nível
- Os componentes criados em um nível são usados como elementos primitivos no nível seguinte
- A linguagem de cada nível tem elementos primitivos, meios de combinação e meios de abstração adequados ao seu nível de detalhe
- A abstração hierárquica em si é familiar para cientistas da computação, mas a diferença importante aqui é a visão de que cada camada deve ser programável
- Nessa perspectiva, as camadas não são apenas mecanismos de ocultação de informação, mas meios de lidar com computação e transformação
- Nas linguagens de programação predominantes, essa estratificação dificilmente leva à extensão da própria linguagem
- Java é Java de cima a baixo; há classes e bibliotecas, mas não novas estruturas de controle
- Mesmo quando construções dedicadas a um domínio específico seriam úteis, é difícil adicioná-las facilmente dentro da linguagem
- Por outro lado, mesmo que se queira impedir o uso de certas construções em um domínio, é difícil removê-las dentro da linguagem
- Java-ME removeu alguns recursos para rodar em dispositivos pequenos, mas não de uma forma possível sem reescrever o compilador
Menos “o que é”, mais “como fazer”
- A terceira influência importante está na visão de SICP sobre o que a ciência da computação realmente trata
- SICP enxerga a revolução dos computadores como uma revolução na forma de pensar e na forma de expressar o pensamento
- O livro descreve isso como epistemologia procedural (procedural epistemology)
- Se a matemática clássica oferece uma estrutura para tratar com precisão do “que é”
- a computação oferece uma estrutura para tratar com precisão do “como fazer”
- Dobson já adotou a visão de que os computadores são como novos microscópios: ao mesmo tempo em que ajudam abordagens existentes, também abrem uma nova ciência
- Esse aspecto do “como fazer” da ciência da computação reaparece em várias áreas
- descrição do funcionamento de redes de sensores que podem se adaptar enquanto refletem continuamente os fenômenos implantados
- interpretação de grandes volumes de dados minerados e combinados em toda a web
- captura para automatizar métodos e processos científicos
- A riqueza dessas áreas incentiva a integração por meio de linguagens de programação, em vez de software empacotado, mantendo interfaces e estruturas flexíveis e experimentáveis com linguagens como R
Por que um livro antigo continua sendo lido
- Dentro do exemplar de Dobson estava anotada a data de compra, setembro de 1988, e em 2010 um livro com quase 22 anos continuava relevante
- Para ele, SICP é quase o único livro de ciência da computação dessa idade que pode ser relido de forma útil, e não apenas por interesse histórico
- Em livros de matemática, conteúdos duradouros não são raros, mas isso é incomum na ciência da computação, onde as ideias mudam rápido e muitos temas são temporários
- O fato de o conteúdo de SICP quase não ter envelhecido mostra que o livro capturou muito bem os conceitos centrais da ciência da computação
- Por isso, SICP é um dos poucos livros de ciência da computação que valem ser lidos mais de uma vez e é avaliado como uma obra que, assim como Lectures on Physics de Feynman na física, destila de forma acessível a essência de sua área e resistiu ao teste do tempo
- Na atualização de 27 de janeiro de 2024, o livro também foi incluído na bibliografia comentada de Lisp na entrada Structure and interpretation of computer programs
1 comentários
Comentários do Hacker News
“Clássicos” como o SICP falam de design de programas, mas hoje em dia design de sistemas parece ser uma competência muito mais importante
Não sei se sistemas distribuídos entram em “ciência da computação”, mas, na prática, são problemas que precisam ser resolvidos com mais frequência
Costumo tornar os sistemas o mais simples possível, usar ferramentas de observabilidade para encontrar os pontos em que o design ficou insuficiente e, quando necessário, recorrer a estruturas de dados ou soluções mais “de ciência da computação”
Na maioria dos casos, notação Big O e complexidade de tempo de execução não importam, e arrays junto com CPUs rápidas resolvem muitos problemas
Mesmo quando surgem problemas de desempenho, primeiro é preciso fazer profiling para encontrar o gargalo
Ciência da computação não ensina bem como o cache de memória da CPU funciona
Um algoritmo de grafos sofisticado pode ter melhor complexidade de tempo de execução, mas estragar o cache da CPU e acabar sendo mais lento que um array com bom aproveitamento de cache
Na prática, os problemas mais comuns são lidar com tolerância a falhas, correção de locks e filas distribuídos, e escalabilidade de sistemas
Talvez eu seja enviesado por ter formação em computação/engenharia elétrica
Aprendi cache de memória de CPU há 30 anos, no primeiro semestre da graduação em CS, pelo livro de Hennessy e Patterson, e até onde sei isso ainda é usado
Tolerância a falhas, correção de locks e filas distribuídos, e escalabilidade de sistemas também foram cobertos na graduação em CS, e eu não tinha nenhuma formação especial em engenharia da computação/engenharia elétrica
Ainda existe trabalho de criar frameworks, motores de banco de dados e ferramentas de controle de versão, e esse tipo de trabalho exige diariamente conhecimento profundo de CS, como algoritmos e estruturas de dados
Mas essas vagas ficaram mais raras do que antes, e é mais comum usar Postgres do que implementar um motor de DB próprio para uma aplicação
A maior parte do trabalho é implementar lógica de negócio; saber como o banco de dados funciona internamente ajuda a produzir resultados melhores, mas dá para criar muito software funcional sem saber como índices são armazenados em disco
Muitos formados em CS se enganam achando que seu trabalho é escrever frameworks, quando na prática é usar frameworks existentes e implementar lógica de negócio, usando sua base de CS para entender profundamente esses frameworks
Os dados existem como “páginas” no disco, e na RAM há um número fixo de “slots de página”
Mover páginas entre disco e RAM é lento, então é preciso minimizar isso ao máximo
Por isso, até problemas que parecem triviais ficam interessantes. Na ciência da computação clássica, não há um conceito separado de “join”, porque ele não é complexo o bastante para merecer um nome
É fácil pensar na pesquisa em algoritmos como uma essência pura, mas também dá para ver a eficiência de algoritmos como algo que só faz sentido no contexto de dados e hardware específicos
É isso que torna o trabalho interessante, e como não basta aplicar bibliotecas ou soluções de receita de bolo em todos os lugares, a especialização em algoritmos continua sendo útil
Estou sofrendo agora por causa de um componente no qual assumi uma pequena alteração: ele tem estado demais sem necessidade e lida com duas abstrações ao mesmo tempo
Ao processar arquivos, usa tanto o sistema de arquivos quanto o banco de dados para armazenar estado, e fiquei surpreso com o quão bagunçado é o design
Passei dias tentando evitar simplesmente acrescentar mais coisas como antes e tornar tudo ainda mais difícil de entender
A cultura de pull requests parece ter feito com que qualquer porcaria seja aprovada sem tempo para pensar profundamente no código real
Queria que as revisões de código presenciais voltassem
Publicado em 2021
O link para a cópia gratuita do texto está quebrado
https://mitp-content-server.mit.edu/books/content/sectbyfn/b...
https://web.mit.edu/6.001/6.037/sicp.pdf
Até hoje eu nunca tinha visto uma versão oficial em PDF
Por volta de 2001, só a versão HTML era gratuita, e alguém a converteu para TeXinfo: https://www.neilvandyke.org/sicp-texi/
Se você quiser acompanhar o SICP hoje, pode executar o código no MIT Scheme ou no DrRacket: https://www.neilvandyke.org/racket/sicp/
A versão atual (v12.1) roda em Macs com CPU Intel executando Sequoia ou em Apple silicon via Rosetta
Porém, o compilador de código nativo está meio quebrado, e provavelmente não é necessário para o SICP
Acho que funcionava em macOS anteriores ao Monterey, então talvez alguma dependência fornecida pela Apple tenha mudado, mas não fui atrás
Se você não precisa especificamente do MIT Scheme e não quer sofrer compilando, Racket pode ser uma opção melhor
Pelo que sei, ele tem um modo SICP explícito
Tentei seguir com GNU Guile, mas há pequenas diferenças de sintaxe entre Guile e MIT Scheme, o que foi bem trabalhoso
A formatação é melhor que a original do MIT: https://sarabander.github.io/sicp/
Antigamente havia um pacote, mas ele está sem manutenção há quase 20 anos
Já o DrRacket tem um pacote específico para resolver esses problemas
É possível assistir às aulas gravadas de 1986 em que Abelson e Sussman ensinam o conteúdo deste livro
A explicação sobre como criar e agrupar abstrações em várias camadas ainda é útil para mim, tanto pessoalmente quanto em mentorias
No vídeo, fica na aula 3A, em 1:07:55
https://m.youtube.com/playlist?list=PLE18841CABEA24090
The Elements of Programming Style vale ser lido três vezes, e já me ajudou em muitas leituras além disso
Se houver interesse, há uma resenha que escrevi em 2010: https://reprog.wordpress.com/2010/03/06/programming-books-pa...
https://elementsofprogramming.com/
A parte do SICP de que mais gosto, e que ficou comigo por anos, é a ideia de programação por desejo
É uma forma de construir algo de cima para baixo, como se as rotinas de nível mais baixo já existissem
Depois você de fato cria essas rotinas de nível mais baixo, descendo até a base
Acho que esse modo de pensar combina muito bem com desenvolvimento orientado a testes
Você primeiro escreve testes para a funcionalidade que gostaria de ter e então vai realizar esse desejo
A maioria dos desenvolvedores parece construir de baixo para cima e acabar com algo que ninguém queria
Você pode desejar por acaso algo cuja verdadeira natureza ainda não conhece, e aí surge uma bagunça frágil na base
Normalmente é isso que acontece, porque a natureza algorítmica das coisas só raramente é intuitiva
Começar de baixo é como partir dos quarks que você realmente tem, e não de “tomara que exista magia”
Não há magia; quando você chega à base, há quarks em vez de partículas mágicas, e nesse processo você também perde as pistas de contexto que ajudariam a converter entre as duas físicas
As duas abordagens têm utilidade. Para resolver problemas profundos, às vezes é preciso desejar com ousadia
Mas, pessoalmente, prefiro colocar a magia na camada logo abaixo do topo
Ou seja, construir de baixo para cima e, pouco antes da lógica de negócio, criar uma camada mágica de conveniência que converta de e para a linguagem do negócio
Assim ela é ajustável e não cria uma bagunça emaranhada até a base
Primeiro ele escreveu uma forma de formatação/tagging que parecia adequada, concebeu um modo de programação apropriado para a marcação — portanto, macros — e então partiu para a implementação
Estou tentando uma abordagem parecida no meu trabalho para criar uma biblioteca que modele G-code em OpenSCAD
Recentemente reescrevi em OpenPythonSCAD “puro”, então espero que fique utilizável
Vale experimentar Pharo
SICP é o melhor livro para ler como primeiro livro ao estudar ciência da computação
Depois de programar por hobby por vários anos e ter contato com livros de programação estruturada e várias linguagens, de Pascal a Common LISP, usei Abelson & Sussman em um curso de graduação em ciência da computação, e foi revelador
Ao mostrar a simplicidade, a beleza e a interatividade de Scheme, ele ensina que ciência da computação é construir camadas sobre camadas de diferentes tipos de abstração
Começa com abstração de procedimentos e abstração de dados, passa por definir uma linguagem específica de domínio por conta própria e implementar seu compilador, e chega até a definir novo hardware dentro de software
Tudo parece tão natural, e só um verdadeiro mestre consegue fazer parecer assim
Mas é preciso comprar a 2ª edição, não a 1ª nem a edição mais recente
A edição mais recente usa Python em vez de Scheme, e não é lá essas coisas
Eu queria muito gostar de SICP, mas Lisp me atrapalhou
Gosto de Haskell e Standard ML
Fico curioso se alguém teve uma experiência parecida
Seria interessante se houvesse um livro com espírito parecido ao de SICP, mas usando outra linguagem como meio
Não é que eu queira fazer SICP em JavaScript
O autor sugere usar KRC ou Miranda como alternativa a Scheme
Não conheço bem KRC, mas Miranda é uma linguagem de programação funcional com tipagem estática que influenciou Haskell
Um livro parecido com SICP sem usar Scheme ou Lisp seria algo completamente diferente de SICP, ou pelo menos não conseguiria ensinar as mesmas coisas
Pela minha experiência, Haskell e ML foram muito mais difíceis de entender do que Scheme, então fico curioso sobre o que exatamente foi difícil
Comecei a ler no mês passado e achei que ele cobre coisas demais
Passa rapidamente por princípios matemáticos interessantes demais e, quando começa a ficar divertido, muda para o próximo assunto
Em outras palavras, é superficial demais
Olhando em retrospecto, também não ajudou eu já ter visto muitas aulas e documentos derivados de SICP, então, a cada tópico apresentado, eu pensava “isso de novo”
Mesmo assim, forcei-me a ir até o fim e, justamente por não ser inteligente o suficiente para lidar com Lisp, acabei aprendendo muitíssimo
Como passei tempo demais lendo o código, sinto que aprendi mais do que teria aprendido se fosse uma linguagem familiar
Também existe uma versão de SICP em Python
Não cheguei a fazê-la até o fim, só dei uma olhada por alto, então não é uma recomendação, mas deixo o link como prova de que existe
https://wizardforcel.gitbooks.io/sicp-in-python/content/0.ht...
Na minha estante, os dois livros ficam lado a lado, e sem dúvida vale a pena lê-lo
Na segunda leitura, mergulhei nas notas de rodapé e nas referências, e ali também havia um mundo vasto e belo
Se minha memória não falha, há um artigo em que Sussman e sua equipe projetaram um processador programável sob medida para calcular propriedades de corpos celestes, ou seja, trajetórias
Como sempre, é algo de deixar a mente atordoada
SICP me fez entender cedo que existem vários modelos de programação, numa época em que, na graduação, eu só tinha aprendido um número limitado de modelos
Foi um dos livros que me deram a sensação de que eu conseguiria me orientar ao ler a documentação de qualquer linguagem, biblioteca ou framework
Ao lado de SICP, eu também colocaria toda a série The Little * como material que vale a pena ler mais de uma vez
Types and Programming Languages também é bom
Para o trabalho que faço, é ciência da computação aplicável, mas não basta apenas ler; é preciso implementar também
Se você não repete, acaba esquecendo partes
Talvez seja porque eu conhecia e respeitava a pessoa, mas releio com bastante frequência os livros e artigos de Dijkstra
Hoje em dia é difícil aplicá-los diretamente, mas fazem bem para o cérebro e, pessoalmente, considero-o um excelente escritor