I will commit CS heresy and call Structure and Interpretation of Computer Programsoverrated. The major ideas I recall learning from SICP were tail recursion, static vs. dynamic scope, functions as data, and what people mean by “closure”. Those are somewhat important ideas in computer science, but not, I would say, among the 20 most important ideas is computer science.
(f) the Pareto principle (both in optimization and development),
(g) what/how distinction (abstraction),
(h) undecidability (can’t tell what a general function does by looking at it).
Might add more as I think of them. I don’t remember my SICP so well anymore, but it talks about (c), (d), (e), and (g). (f) is a general engineering principle, not specific to CS, (a), (b) and (h) are on the theory of computation side.
Some big ideas that occur to me, from a systems point of view:
The notion of hiding implementation behind interfaces.
The notion of functional layering—that if the system offers some limited set of features, you can implement other features purely in terms of those lower-level features. This is a key idea behind modern networks.
The notion of building reliable systems out of unreliable parts, using redundancy and retries. This is the key technique in such varied systems as RAID, TCP/IP and MapReduce.
The notion of enforcing safety properties in a programming language. The big insight of programming language design is that you can make it impossible for some mistakes to arise in a given language.
I never actually read SICP so I can’t comment on which of those ideas are in the book.
In my mind the first two bullet points are under (g) (I may have been too abstract in my description of (g), but what I had in mind would include both of these).
Sounds like you approached SICP once it was already beneath your level. The main thing to take away from SICP is that programming is the construction of processes—hierarchical descriptions of what the computer is tasked to do, with no detail left out. This and the implications of it were probably already obvious to you by the time you approached the book.
In my experience, most comp sci or programming textbooks are like grammar, vocab, and style guide to language, whereas SICP delves into the very nature of language itself, it’s purpose, what we use it for, and overviews of why and how we study it. You can drill the grammar and vocab later.
I will commit CS heresy and call Structure and Interpretation of Computer Programs overrated. The major ideas I recall learning from SICP were tail recursion, static vs. dynamic scope, functions as data, and what people mean by “closure”. Those are somewhat important ideas in computer science, but not, I would say, among the 20 most important ideas is computer science.
This is a fun game you propose. Here are what I think the important ideas in CS are (no particular order):
(a) turing universality,
(b) distinction of p vs np,
(c) dynamic programming/memoization,
(d) styles: declarative/functional/imperative/oo,
(e) metaprogramming (including algs as data),
(f) the Pareto principle (both in optimization and development),
(g) what/how distinction (abstraction),
(h) undecidability (can’t tell what a general function does by looking at it).
Might add more as I think of them. I don’t remember my SICP so well anymore, but it talks about (c), (d), (e), and (g). (f) is a general engineering principle, not specific to CS, (a), (b) and (h) are on the theory of computation side.
Some big ideas that occur to me, from a systems point of view:
The notion of hiding implementation behind interfaces.
The notion of functional layering—that if the system offers some limited set of features, you can implement other features purely in terms of those lower-level features. This is a key idea behind modern networks.
The notion of building reliable systems out of unreliable parts, using redundancy and retries. This is the key technique in such varied systems as RAID, TCP/IP and MapReduce.
The notion of enforcing safety properties in a programming language. The big insight of programming language design is that you can make it impossible for some mistakes to arise in a given language.
I never actually read SICP so I can’t comment on which of those ideas are in the book.
In my mind the first two bullet points are under (g) (I may have been too abstract in my description of (g), but what I had in mind would include both of these).
Sounds like you approached SICP once it was already beneath your level. The main thing to take away from SICP is that programming is the construction of processes—hierarchical descriptions of what the computer is tasked to do, with no detail left out. This and the implications of it were probably already obvious to you by the time you approached the book.
In my experience, most comp sci or programming textbooks are like grammar, vocab, and style guide to language, whereas SICP delves into the very nature of language itself, it’s purpose, what we use it for, and overviews of why and how we study it. You can drill the grammar and vocab later.