Structure and Interpretation of Computer Programs (1996) [pdf]
opendocs.github.io
opendocs.github.io
https://amontalenti.com/2018/08/26/sicp-expanding
As for an update: SICP was as good as I expected and definitely makes a professional programmer regain some love for the art and magic of computer science. (However, the book is a hard read without a guide. But it's really fun if you alternate between coding and reading, by using a local Racket & DrRacket install.)
One can find recorded courses from MIT with the SICP authors on YouTube, so that may be one way to do this from home.
Hal Abelson was recently interviewed about the lasting influence of the book in this podcast. It's a good conversation:
I’d suggest going with a scheme such as racket.
I've been working through the book in Javascript - https://github.com/ahuth/sicp/. Maybe I'm losing something by doing it in JS instead of Scheme, but I'm still learning a lot and having a ton of fun.
Wrote a little bit about SICP here: https://ahuth.github.io/articles/the-first-time-sicp-blew-my....
There's no impediment to completing Chapters 1 & 2 in Clojure, but the first chapters are not what is called to mind by "Structure and Interpretation of Computer Programs" [1].
- Function redefinition is extremely useful required if you want to write your code in a linear fashion as intended. Clojure automatically sets up a major hindrance here.
- A few subchapters explore parallel computation, Clojure is likely to lead you astray here as you try to find directly corresponding functions and why exactly the authors are suggesting.
- Several chapters explore mutable lists in detail. Serious complaints have been made about the suitability of Racket here, where there exists no more of a barrier than that methods which operate on mutable lists are prefixed with a specially named qualifier. Clojure would be functionally impossible here.
- On the plus side, the "JIT" meta-evaluator will be a much more interesting challenge!
You'll notice that all of these issues can be worked around. However, SICP with exercises will take you about a year if you're a serious student.
[1] Huffman trees exercises excluded.
[2] Doing the whole thing in Emacs Lisp is potentially fantastic. I don't know if I can wholeheartedly recommend it, but I would be really pleased if someone wrote tests and built the metaevaluator, compiler and really went the whole nine yards here.
I worked through the book using #lang sicp in racket however.
I’d love to do this myself with other people! The idea of a "retreat", seeing programming as a hobby is great.
I am a self-taught programmer, and survived a long time on C/C++/Java etc. I was smugly confident in my confined space.
Then I came across SICP. I discovered a world of closures, streams, object-orientation done using closures, infinite series using streams, lazy evaluation, functional programming, and so much more. It was such a sharp pivot that I registered for a PhD because I just had to know what else I took for granted. I was 42 when I registered (graduated at 48)!
Security Engineering. Ross Anderson
The Formal Semantics of Programming Languages. Glynn Wynskell.
Communicating Sequential Processes. Tony Hoare. This book is surprising in its compactness and lucidity.
Pi Calculus. Robin Milner.
Semantics With Applications. Hanne Riis Nielson
On Concurrent Programming. Fred Schneider.
Specifying Systems with TLA+. Leslie Lamport.
Distributed Algorithms. Nancy Lynch.
Reliable Distributed Computing. Ken Birman and Robert Van Renesse.
I'm sure I'll recall more as soon as I hit "reply".
Would you mind expanding a bit more about your PhD? Which school did you go to? Did you find that your age made it more difficult to get in/stay in once accepted? How did you handle family commitments (if you had them)?
Reason I ask is because I've been considering going back to school to get a PhD.
Again, that is quite an achievement, so congrats!
I had been living and working in California, and found myself at the crest of the dot-com wave of the late 90's and early '00s. But post-SICP, I _had_ to dig deeper.
I didn't feel prepared for the schools I wanted to apply to: Berkeley & Stanford. I am totally self-taught, and not having taken an exam in any CS subjects, the subject GRE was a huge mental barrier. So I applied to the Univ. of Cambridge in the UK.
That was a miscalculation. I was expecting to sit through a number of courses before figuring out what I wanted -- the US model -- but no, I was thrown into the deep-end right away, as an independent researcher. In my earlier life, I'd prided myself in knowing a whole lot of stuff just by building things in my own time (a TCP-IP stack from scratch, a Java compiler etc). But at Cambridge, I was told the "Dragon Book" (Compilers, by Aho, Ullman and Sethi) was so 1970's! I can't tell you how inadequate and how unprepared I felt.
In just the areas I was interested in (PL, concurrency, distributed systems), I was surrounded by researchers (at the cs dept and the microsoft research lab in the adjoining building) who _defined_ world-class. Robin Milner working on Distributed Pi Calculus, Tony Hoare on separation logic, Simon Peyton Jones on Haskell and type systems, Alan Mycroft, Jon Crowcroft advising the creation of the Raspberry Pi, Ian Pratt and Steven Hand on the Xen hypervisor, Peter Sewell on a rigorous (machine-checked) definition of systems and protocols.
But me, I didn't understand any of it, at least in the first year! I had never read a non-systems paper in my life; I didn't know the meaning of academic rigor. Those four years were the hardest of my life. Age was a factor. There was a distinct difference in stamina. Later I discovered that it was more fear that stymied my progress. I used to love math in my younger days, but I realized that lately, I was putting the more formal books back on the shelf "to get back to later". In contrast, Younger kids (and particularly the ultra-bright ones who land up at Cambridge) had no such fear at all because their formative math education had been top-notch.
On the other hand, my age served me well elsewhere. I had money, I was happily married (and still am, thank you!), so half my brain wasn't stuck on relationship issues. I didn't have to impress my peers with my ability to drink. I could travel freely to conferences on my own dime. I could quit any time (or so I told myself; I'd probably have regretted it if I had quit). It helped that we didn't have kids and that my wife was immensely supportive. There was another "mature" student also with the same background and outlook as me who'd sold his company for a few tens of millions (he was on the original Pentium design team!) and come in search of knowledge. He had two kids. He had a tougher time than I did not because of his family, because of the choice of his subject (quantum computing). But ultimately, he too has done well from himself.
Any how, I knew all along I would be very glad when the program ended, on two different axes. First, that the hard period was behind me. Second, that all this learning would fundamentally change me. I'm happy to say it did. I'm happy to report that I fared well -- my dissertation was nominated for a British Computer Society dissertation award. Privately, I felt I was trained just well enough to _start_ a PhD program. That imposter syndrome never left me! I have met many many PhDs who have felt that. I wish someone had counseled me on it.
I'll leave you with this. The amount I learnt makes my toes curl with pleasure. Then there's the meta-learning. When you spend so much time reading papers and rigorous arguments, you begin to have confidence in reading a paper completely beyond your ken, and getting to its essence. That's the real value.
I recall sitting through a denotational semantics course and the students (all of 18 years old) were asking apparently relevant questions, and the prof (Glynn Wynskel) would say, 'that's a good question'. And I'm sitting at the back of the class awed at this spectacle! I'm wondering what was in this kid's background that prepared him better than me for this course. I have written a compiler, dammit, and I have 20 years of experience. The odds are that I should have heard something in those 20 years that left me marginally better prepared. But no. Here I am, understanding neither the question nor the answer!
It is only in my third year that it clicked. It was just a resistance to formal math, a resistance I had no idea I had. Once I got over it, and I was able to treat math notation as a compact way of writing it out, I started having a good time.
I have a suspicion that quality teaching alone would not have solved your nagging feeling. You need soak time. I am convinced that the 1-year masters programs in the UK (and increasingly so in the US) are a scam. They are only good for the uni to make money, but the students are shafted.
Also how was it like applying for a PhD without an undergrad?
As for applying without an undergrad, I was able to parlay my industry work as relevant, because I was applying to the systems group. I'd have had far less trouble if I had just stuck to systems. I would have had to brush up on algorithms and statistics and control systems, and I would have been set.
But noooo, that would have been too easy!!
I found my attention drifting to programming languages, and then I was on totally thin ice.
I did Part III in '83/84 and a PhD in DPMMS from '84 to '87, and having come in to the Cambridge system from outside, I was way out of my depth. The amount I learned was quite unbelievable.
If you'd like to connect and share experiences, by contact details are in my profile.
Oh absolutely! In so many ways ...
Your note on "fear" holding you back rings a bell. As I have aged (and I have not aged that much!) I have noticed the same. And I feel like it gets worse every year. I haven't found a better solution than just jumping in outside my comfort zones, but alas, this is so hard that I find myself barely doing it.
But people like you remind me that it can be done! And this is very important because knowing that someone else did it cancels some portion of that internal discourse of "You can't do it.".
Thanks again.
This book is so important I sometimes think there should be a link pinned to the front page.
It too really opened my eyes like no other book had and was a major influence on my PhD work and also subsequent projects I've done in industry. I really liked your other detailed comment about your experience, and am jealous you got to work alongside such major players in the field :)
In my earlier responses, I haven't credited my wife enough. It is one thing for me to take a chance, but it is altogether a different ball of wax for her to say we are in this adventure together.
The typesetting of this book seems due to Andres Raba (sarabander on GitHub), and the LaTeX is generated by a script from texinfo format: https://github.com/sarabander/sicp-pdf/tree/5b3a5b2/src
https://mitpress.mit.edu/sites/default/files/sicp/index.html
https://mitpress.mit.edu/sites/default/files/sicp/full-text/...
Other versions, again not as PDF:
https://news.ycombinator.com/item?id=13918465
https://news.ycombinator.com/item?id=19049834
> https://news.ycombinator.com/item?id=3034587
This one is a link to a .mobi/Kindle version, for anyone searching.
https://www.youtube.com/watch?v=-J_xL4IGhJA&list=PLE18841CAB...
However, I could never get into SICP mostly because it was so... impractical and pure.
Besides i'd had enough of RPN working on https://en.wikipedia.org/wiki/Elektronika_MK-61 .
I suppose one should get into SICP when one is still at the right age (<25)
What endeavour exactly?
On the chance you don't know — and because many don't — Kernighan & Plauger wrote The Elements of Programming Style a few years earlier.
S&W is a bizarre book: it's a pleasure to read because the authors are both excellent writers, but they don't know anything about grammar so their advice often makes no sense. Seriously, read it again (it's a short book) and count how many times they actually follow their own grammatical advice (their advice not about a technical grammar point is usually sound, and you should, for example, omit needless words). My opinion is that you should take S&W as style exemplar, but not a style guide.
Geoffrey Pullum's article 50 Years of Stupid Grammar Advice explains all this better than I can: http://www.lel.ed.ac.uk/~gpullum/50years.pdf
CTM is in many ways a SICP sequel, and equally ambitious.
Some other pointers: http://wiki.c2.com/?ConceptsTechniquesAndModelsOfComputerPro...
We never had any readings from SICP. It sat on the shelf like an unread bible. I went back to it much later but I didn't like its conception of computer science. I compare it directly to Knuth's Fundamental Algorithms and it just didn't inspire me at all whereas FA did. I'll grant that I can't imagine a freshman course using FA, mostly because assembly language is very much de-emphasized.
However, I'll second someone else's comment about the beauty of the typesetting of this edition. And I really liked Scheme. But neither 61A nor SICP are touchstones for me.
The Python course happened clearly due to politics and popular appeal. Sussman expressed his disappointment about it multiple times. Abelson did the same in the interview that's linked in this thread.
It is sad but a good example of how far the academic institution has fallen in this century. Ultimately it is the students that really lose out.
What's your personal experience with SICP? It sounds like you were a student in one of these courses ("we never used it again") but you also wrote "We never had any readings from SICP." so I'm not sure what you took and when. Did you work through SICP and still find it overrated?
(Note that I am commenting on the first half or so of the book, never having gotten past that. Maybe the last half of the book is the best book ever written, I do not know.)
For one thing, half of the examples are calculus. If you are an engineering graduate student with experience in fortran (which is the original intended audience, just watch the original lectures), that's a great idea. For humans with little to no formal mathematical training, it's pretty poor. I once helped to lead a study group on SICP with half a dozen highly motivated junior-to-intermediate programmers, and everyone found the exercises insanely hard for this reason. (Of that group, btw, I would say one student greatly benefited, two dropped out, and the rest got some benefit.)
For second, I strongly disagree with the claim that functional is a "more natural" or "more intuitive" way to think about programming. I've helped teach hundreds of adult students to program (and become working developers), most of them with no prior experience, and I would say that less than 1% of them found recursion anything other than a crushing mindfuck. Whereas more than half of them took to imperative programming in a much shorter length of time (a few weeks, say). (None of these students were given SCIP, tho.)
Based on the perennial praise in threads like this, I concede that must be those in the world for whom it's a great book, and that's great. I am firmly convinced that these people are atypical.
On the other hand, it is a book that concerns itself with important questions, where IMO most books do not, so that alone makes it, as I said at the beginning, a member of a rare and distinguished category.
I don't totally disagree with you btw. Pretty sure in that interview with Hal Abelson someone mentioned above, he admitted the book leaned a little heavily on calculus because all MIT freshmen had to take that course, so it seemed a natural source for examples. Perhaps not as natural to someone who hasn't taken a calculus course in a decade (me). I still got a lot out of the book though.
This is correct: The course number was 6.001 and was a requirement in EECS in those days. I took it while SICP was still only notes in 1983, and the notes ended up as a book shortly after.
I also think you are introducing functional programming the wrong way to beginners. It's best and most intuitive use imho is in a math class. For example this book: https://cs.wheaton.edu/~tvandrun/dmfp/ has little prereqs, and will teach the reader both programming and math regardless of educational background. It really, really shines when it comes to learning counter-intuitive things like cardinality. I'm not the only person who thinks so either, here is one of the curriculum designers of Bootstrap, a US highschool programming curriculum, explaining how naturally that style of programming fits with algebra classes. https://www.janestreet.com/tech-talks/curriculumn-design/
Throughout the authors have very good taste in choosing the level of detail and realism in which to implement things to let you quickly get at the core ideas without getting bogged down in technical points.
As for the first half only being fit for fortran-programming engineering students, I remember that very differently. I only remember a few examples as requiring calculus, say Newton's method, some numeric integration procedures, symbolic differentiation, power series implemented as lazy lists of coefficients, maybe one or two more. And other than the power series, I don't remember any of those examples as requiring more than just high school calculus ---which makes sense, because I think the course is meant for college freshmen, which will have only completed high school calculus, and probably are taking a more advanced calculus class concurrently.
Although judging from my own undergraduate students it is probably best not to assume most students remember calculus from high school. Plus, I understand there are countries, such as the US, where calculus isn't even compulsory in high school! So maybe removing those few calculus examples would make the book seem friendlier and shorten it by 10 pages or so.
It was worth the read. I just think with a wider variety of examples, I could have gotten the exact same benefit with far less extraneous effort.
Maybe 20 years ago, the authors put the full text for their textbook on the Web, as HTML. This made it more accessible to people, and set an early precedent for freely-available top textbooks on the Web (even though they presumably could've made more money by only selling print copies).
Then, since not all students' computers could run a Web browser, Lytha Ayth manually converted the HTML to Texinfo, with ASCII art of all the figures.
If one has the means to buy the printed book, doing so would seem like a nice gesture, in response to the authors' and publisher's generous sharing and example-setting.
Code: https://github.com/stanfordhaskell/cs43 Site: https://stanford-lambda.gitlab.io
All of the course materials will be open-sourced @ https://github.com/stanfordhaskell/cs43 (previously Clojure, now Haskell!)
If anyone has concrete suggestions on how to improve our curricula, I would be happy to take any suggestions.
My favorite part of SICP is where a streaming lazy evaluated version of sin() is defined using cos() which is defined using sin().
Does anybody know where I can/should host a copy?
With torrent or IPFS, perhaps? (Given the CC BY-SA license, this would be completely legal.)
Also, GitHub's behaviour wrt to LFS is really disappointing — the epub file could have been stored normally with git (its size of ~ 3 MB is far less than the hard limit of 100 MB), in which case there would have been no issues of exceeding a data quota...
For comparison, the linked PDF is normally indexed with git, despite weighing at 7.7 MB.
Since LFS is supposed to reduce total bandwidth use for the hoster, GitHub is, in effect, punishing people for reducing GitHub's bandwidth usage...
Actually, the linked PDF is originally[0] by the same author as the EPUB version you linked. However, in the original repository[0] the PDF is managed with LFS, so it's inaccessible...
On Debian GNU/Linux, I had to install a few packages in addition to base tetex: latexmk fonts-inconsolata linuxlibertine fonts-linuxlibertine texlive-fonts-extra texlive-latex-extra
I also downloaded locally installed the two suggested fonts to /usr/local/share/fonts/truetype/
Build took a few minutes on an older box, but looks spiffy.
I'm read a PDF :/
It is poetic in its treatment of introductory computer science.
Please, do it every couple of months.
It seems to me that this is somewhat like the "dragon book" - people were exposed to it before they had read other better books.
I just went an reread the forward, and nothing struck me as controversial. Could you elaborate a bit?
State is only introduced on page 294!!
Diving into codebases, like the octave and supercollider interpreters recently. might be quite interesting to re-read it.
Or, does it assume some prereqs?
However, it is designed to be used in an introductory university course led by experienced instructors. Without support, even a highly motivated high school group would have a hard time with the material and pace. So I would say it all depends on the high schoolers, and especially on the support available.
My recollection from the bit of time I spent with it was that most of the examples were drawn from mathematics, often times relying on implicit bits of knowledge that would lose a reader unless they'd had long interest/experience in math.
I think the issue in divided opinions here is a matter of lost perception of the range of math knowledge: I've noticed this same communication difficulty when playing new people at Go and they ask whether I'm good or not. I never really know how to reply because on an absolute scale I'm an abysmal player—but against anyone who's never really studied the game I'll appear incredibly skilled.
When people answer that SICP requires very little math background, I think that's an accurate phrasing relative to a more global scale of math knowledge. But in the realm of folks with no particular interest in math, it requires a relatively sophisticated knowledge of mathematics.
If a high-schooler is training for math olympiads or they're on track to study math/CS/etc. at a top-tier university, they'll probably be fine. All the others will likely be completely lost.
Here's another example from today's thread: https://news.ycombinator.com/item?id=21301474
However, I do think the math shouldn't be a great hurdle with the right guidance, but:
> If a high-schooler is training for math olympiads or they're on track to study math/CS/etc. at a top-tier university, they'll probably be fine. All the others will likely be completely lost.
This is probably the right answer.
Bills itself as an intro to SICP for high schoolers.
I did a quick glance and HDP seems to use DrRacket, but is the material comparable, with HDP just more appropriate for beginners??
For high school students, it's likely to be more appropriate.
That said, if a student expresses an interest in SICP, they shouldn't be dissuaded from tackling it.
They overlap some, but also each have unique lessons from a student would benefit.
The last time I did any kind of math that was more complex then simple operations was a long time ago and math was never my strong subject.
I have pretty much forgotten any kind of algebra, calculus etc I learnt. So assuming I know very little math, what is the best way/book/method to learn algebra/calculus etc to tackle SICP ? I would like to do that before I begin my SICP journey.
Any suggestions appreciated!!
Start with the Pre-Algebra book, then Algebra and Trigonometry, and then Calculus volumes, the first two volumes are more than enough for SICP.
This can take you two years depending on your time.
Does the MIT Python replacement go "functional first"?
https://mitpress.mit.edu/sites/default/files/sicp/full-text/...
Also, the physical book is available for only $40.
I know technical books are expensive and the book has 688 pages but it seems expensive.
If somebody wants to ship their used SICP book in Romania I would love to take it. It's on my wish list since forever.
Salutari din Romania!
https://www.biblio.com/search.php?author=&title=structure+an...