(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).
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).