"Kinda started reading it but didn't get what the hype is all about".
I put it on my to-read list after reading Peter Norvig's review. I read maybe 2% of it and skimmed a lot more. While I'm sure I could learn quite a bit if I seriously studied the whole thing, I'm not sure it would be a good use of my time: most of the contents I already studied in college, though in a quite different approach. There are topics that I'm weak at, but if I decide to learn (say) compilation for real then I'd be better served by reading a book focused on compilation.
In other words, while SICP seems rather hardcore as an introduction to computer science, it feels rather unexciting as a review of my CS undergrad syllabus.
I think you're underestimating the depth of the book.
I read SICP and took a distance-learning version of 6.001 as a first-year grad student (undergrad BS in CS) and found it to be very challenging if your goal is mastery of the material. Another grad student, who was on a team that placed second in the national Putnam exam (i.e., a national-level math geek), also found it quite challenging.
Two of my professors, both now Fellows of the IEEE, also took the course with me and found it just as deep and original, and even more challenging, than we young computer weenies did.
Some courses, you have to take twice to master. For me, information theory was one of those. And I suspect that to a lot of MIT undergrads, 6.001 might be like that. The first time, you're just too bogged down in tactics to see the big picture(s).
Oh, I don't mean to say the book isn't deep; my CS undergrad courses were quite deep! In any case, yes, it's quite possible that I'm underestimating the value of the book for me.
You'd be surprised. I worked through SICP a few years after graduating, and after the dragon book, and it still managed to warp my brain in new and exciting ways.
Congrats on making it through both. I haven't gotten to the dragon yet... For those interested, you can get a red dragon for significantly less than the newer editions (check amazon).
I'm not familiar with that one, but the table of contents looks promising. If it's even half as good as
his _Parsing Techniques: A Practical Guide_, it's worth checking out.
I never understood what people like about the Dragon book. It talks you through implementing a compiler for an imperative language in an imperative language in a very pedestrian way. Give me more theory!
"but if I decide to learn (say) compilation for real then I'd be better served by reading a book focused on compilation."
If you're a total noob at compilers, as I was when I read SICP (and still am) I think chapters 4 and 5 are a great intro. Like other Lisp/Scheme compiler and PL books (Lisp in Small Pieces, PLAI I think, EOPL to a lesser extent, parts of PAIP I think) SICP doesn't scratch parsing and lexing, but just uses (read). This means you can get to interesting stuff like program analysis and code generation without getting bogged down in parsing, at least at first. It's a really nice approach to learning that stuff.
I ran a lunchtime SICP reading group at my last job wherein we read a section or two at a time and someone (usually me) would illustrate the concepts by walking through our own Java code base (a big industrial ad server). It helped that we were already using a bunch of functional programming idioms, and that we had a few little compilers in the code to begin with, but viewing all that agile-developed code through such a pure academic lens remains one of the more professionally rewarding exercises I've yet had.
Even though I'm still mostly a mouth-breathing Java programmer; at work anyway.
An enthusiast has created an improved version[1] of SICP, free
download available.
Description:
The typography has been modernized for better on-screen legibility
and comfort. All the mathematics is set in proper TEX, and figures
redrawn in vector graphics.
If you're unsure what the OP is talking about, SICP stands for "Structure and Interpretation of Computer Programs" aka "The Wizard Book". http://mitpress.mit.edu/sicp/
When I was in college I was browsing the library and I just grabbed this book on a whim. Had no idea what it was or that it was so famous. Began reading and got hooked, so I checked it out. Next thing I knew I had read the whole book and done most of the exercises. Not to be too dramatic, but it was a turning point in my understanding of programming.
Wow, Eli, I didn't know you post here. Your blog was essential to my understanding SICP the first time I went through it. Thanks for the great resource!
Personally, I'm a physician with an undergrad in physics, played with logo and basic as a kid. I picked up SICP and got to chapter 2 or 3 on my own time last summer but set it down to go learn Python as it was pretty obvious Abelson and Sussman expect you to either be a bachelor's degree candidate with a lot of time to work on this, or you have a substantial background understanding to bring to bear.
I tried Ruby but didn't like the flavor. Too sugary, too much stuff. My goal is really to add math to my diet, I don't need a job. I see Python as a good starting point to get some fundamentals under my belt, access to a large community with a lot of running software, and then get back to more lisp-like languages, R, and functional programming. Perhaps I didn't give Ruby a fair shake, I'll probably visit it again.
Lutz's Learning Python and Shaw's Learn Python the Hard Way have been a great combo for me as an independent student. Lutz does a great job of hand-holding in the beginning, which can be critical for the solo learner out there, but I wouldn't be the first who started getting impatient half-way through. Which is where LPTHW takes off. However, I have also gotten good use out of the beginnings of a lot material. A few notables:
* Little Schemer -- I admit, I didn't see where it was going, shelved it, but loved the puzzling presentation. Will probably pick it back up after I finish LPTHW.
* Real World Haskell -- Some great introductory conceptual materal, but assumes a huge amount of prior knowledge. A noob can't pick up this book and learn programming.
* I just want to make mention of the fact that Windows hit the scene when I was a freshman in highschool and dominated my computing life for 15 years. The intellectual cost of that obstruction to the efficient use of my time can't be over-estimated. I have a visceral disgust for Windows that defies any logic.
* Conversely, my Cr-48 running Ubuntu has a wonderful study partner. It was quite wonderful to be reading LPTHW in Calibre, look to customize Calibre's buttons a bit, and find out it's written in Python. I have a visceral gratitude toward Google and the FLOSS community that defies any logic.
* Finally, Shaw's Advice from an Old Programmer is the best career advice, in any field, I've ever read (having done physics, military, and medicine). Read it or be square: http://learnpythonthehardway.org/book/advice.html
[edit]: for anyone who reloaded the page and found this comment elsewhere, my apologies. This part seemed better as a stand-alone comment.
Real World Haskell is definitely not for beginners. Try Learn You a Haskell for Great Good first. Still not for total beginners but since you already know Python you're good.
No doubt, it wasn't intended as a negative. But for the independent student, stating what may seem obvious can be critically necessary. Compared to both O'Reilly titles and plenty of assigned course readings, that wasn't entirely clear to me until I had a few problem sets done. For example, Norvig's review makes it sound like it can be read lightly. Maybe only if your name is Norvig. I don't know.
Maybe the CTM book might be something for you as well. See my other comment[1] to learn more about it. Norvig says[2] the following about it:
Concepts, Techniques, and Models of Computer Programming (Van Roy
& Haridi) is seen by some as the modern-day successor to Abelson &
Sussman. It is a tour through the big ideas of programming,
covering a wider range than Abelson & Sussman while being perhaps
easier to read and follow. It uses a language, Oz, that is not
widely known but serves as a basis for learning other languages.
This tends to be the style of thinking at MIT, i.e. oh these are undergrads with a bunch of time, they should be able to do learn everything really well, thoroughly, and from the ground up! The end result is a bunch of classes that pack a lot of punch. This is great once you're ready to learn things inside out and from the bottom up, but not so great if you're new to the area or just trying to get a quick overview to get you off the ground.
Just about every class at MIT is like this. That is, professors assume you have the time and energy to learn things the "right way" and will really give you everything they've got. They usually forget the fact that students have usually 3 or 4 other classes like this which makes for quite a tough curriculum.
I personally loved this aspect of MIT. It's not the most practical or concise way to do things, though. If you're new to CS or just looking to get up on something quickly, definitely don't feel bad to look elsewhere.
Hmm, it took me about 6 months to get through SICP the first time. I worked on it probably about an hour a day and more on weekends. I wouldn't worry about trying to understand everything the first time through. I got much more out of subsequent readings.
I've started reading "The Haskell Road to Logic, Maths and Programming", maybe that's something for you or some other lurker here that would like to improve on math.
There is a review [2] that gives an interesting impression on the book. The other ones at amazon might also be interesting.
The table of contents + first chapter is available as a postscript file[3]. This should give you an idea what to expect from the book.
I have this book as well has "How to Prove it." They cover virtually the same material, however I found the prose in "The Haskell Road" to be stilted and sometimes confusing. I got much more out of "How to Prove it."
Interesting; thank you for providing your perspective.
Both books indeed share most of the topics, although from glancing at both TOCs HR seems to add Polynomials and Corecursion.
I'll gladly keep this in mind should I get stuck with HR.
This isn't to say that HR is bad, on the contrary it's quite good. Be prepared to use Google though. How to Prove it is much more self-contained.
It is true that HR covers Polynomials and Corecursion. If I were you, I'd order both and use How to Prove it if you get stuck with The Haskell Road. They're both very inexpensive.
For those who have read it, I'd be interested in knowing what it is that you feel you got out of it, ie how did it make you a better programmer? Better understanding of what's going on at a low level?
A much better understanding of what the computer is really doing, a much bigger bag of tricks to pull out when faced with a hard problem.
Post SICP, I have no fear of recursive algorithms, or closures, and a healthy understanding of asynchrony. So the kind of JavaScript programming that a lot of people find advanced is very natural to me.
A few months ago I implemented a JS library to parse a certain format using some fancy recursive JS combinators. It's fast, it's innovative, and it will be used on a few top-50 websites pretty soon. Internally, the thing is all about the techniques I learned from SICP -- the intermediate format is basically Scheme in JSON form.
The "interpretation of computer programs" part is nice to know, in my opinion. But the book gives a whirlwind tour of a sizeable chunk of computer science on the way, and the examples are concise to the point of being beautiful. Great book. Used it to learn clojure along the way.
Another vote for this! I on;y did about 20% of the exercises... I wish I'd done more. Whilst I understood all the concepts at the time, I'd probably struggle to drop in at a random point and do an exercise now.
I read all of it and solved a substantial number of the exercises. If anybody knows how to recover lost data from a dead HD with ext2 file system, I would get the adventures of my youth back.
I read it this January after hearing it mentioned so many times. I was very impressed. My impressions were:
1. Ah, that's what it would have been like to attend a GOOD university!
2. Much of the systems knowledge I learned the hard way are clearly explained here. This would have jumpstarted my career by 10 years.
3. No current first-year student would sit through this. Though, it should be required reading for seniors.
Having read a few pages of Structure and Implementation of Computer Programs, available for free at http://mitpress.mit.edu/sicp/, I quite liked it and thought it was well-structured and well written, and have added it to my disturbingly large reading list.
Nah, I'll read CTM (Concepts, Techniques and Models of Computer Programming)[1] first, as it addresses concurrency, for example, and seems to be easier to digest.
CTM is viewed by some as a/the modern successor of SICP.
I had been looking for opinions regarding CTM vs SICP to choose which to read first and I've found two postings [2][3] from a mailing list to be very helpful in that regard. Also a comment on HN[4].
I do plan to read SICP sometime in the future as I'm already interested in Lisp, i.e. I'm reading Practical Common Lisp, On Lisp, deferred Paradigms of Artificial Intelligence Programming for later and plan to read Lisp In Small Pieces, which covers compilation.
I've also stumbled across PLAI (Programming Languages: Application and Interpretation)[5] by Shriram Krishnamurthi which seems to cover similar topics, and I plan to dive into that sometime in the future as well. If someone can tell where PLAI stands in contrast to SICP or CTM, that would be very helpful. Ah well... I found an opinion [6] on that too.
I started reading it but stopped at some point, because all the advice - which I totally agreed with - was just too obvious if you had many years of experience and exposure to a couple of different kinds of programming languages and worked in a bunch of different shops. Buf I've heard many smart and experienced programmers praising it. Not sure if it's meant to be read by beginners only?
I'd suggest e.g. "On Lisp" for every experienced programmer, which is available for free too, in case you are not already a crazy LISP hacker, THAT'll learn ya! It is amazing how easy it is to do a couple extremely complex looking, universally applicable tasks (query parsing and processing, pattern matching, ...) - once you grokked a couple of concept you don't get exposed to normally in your mainstream language.
I've read about a couple of chapters based on a recommendation that these select couple sections would broaden my view of designing parsers and understanding s-expressions. It did. On the other hand, I skimmed the rest of the book and didn't find anything in particular that I needed out of the text. Thus my choice of 'No and I don't want to' seems like a fair one considering I read way less than 25% of it. Maybe a chapter count poll would be better. Let's call it a 5% for me.
I'm guessing that developers don't actually ready cover to cover and cherry pick sections until books reveal more pertinent info later?
I'm through about 25% of it, but I decided to do all of the exercises in Haskell rather than Scheme. In a way it improves the experience as a whole, thanks to type errors slowly prodding me in the right direction.
By reading the post title, you've now heard of it. Once you decide whether or not you want to read it, "No, and I don't want to" or "Not yet, but it should happen soon" would be a good choice for you.
I have started it twice: first time I got to chapter 3, second time I got stuck at chapter 4. It sounds a bit petulant to say, but I think it already has made me a better programmer. I had to stop for various life-related issues, but I love how it's written. Whatever you think of it as a beginner's textbook, it's a great piece of literature.
Recently I had to do some Gimp scripting and got some experience using Scheme as a programming language (as oppoosed to a learning language for doing SICP exercises). The moment I have some free time again I will try SICP again.
Been there, read the book, took the class, missed the first arrow on the CDR diagram on the first exam, TA'd the class, enjoyed the wizard hat. Two thumbs up.
I'm reading it right at the moment.
It's a bit of struggle coming from a Oracle/Ruby background - particularly with some of the high level (for me) maths background required.
I often think of working thru HTDP instead, but finishing SICP has become somewhat of an obsession - I will not stop til I have worked thru the thing from start to finish, no matter how long it takes . . . (and so far, it's taken about 6 months)
Had it as a text as an undergrad. Didn't fully comprehend it at that time. I have been revisiting it lately by watching the Abelson and Sussman videos -- which BTW are excellent (and hilarious too). Now that I have been working as a software engineer for 20 years, I can see how much these concepts would've helped me along the way if I had internalized them.
talked with a couple of guys from MIT who took 6.001, and asked them if they'd read SICP. They looked at each other and laughed, and said something along the lines of "Haha, ostensibly. I mean, we turned in our homework." Does that represent your experience as well?
If that's a legitimate indicator of wider behavior on campus, then I can see why the professors might question the utility of that book in that setting.
I took 6.001, and that's about how I remember it from back then. It's a great book but if you were going to lectures or willing to wrestle a bit with the problem sets, you didn't really have to touch the text. Sussman (as I recall) was a great prof, but one of the risks of having the book for the course written by the prof is that they may not be as objective about how well it's actually being used by students.
Yeah, I guess that's about right. (usually) go to class, scan the pset and read up on the bits that don't make sense, or better yet, find someone to explain them. I do have some distinct memories of reading the book. I wasn't a great student and I find it a challenge to read lots of technical stuff without a specific purpose, so I'm not sure my experience is representative.
I think I read about 10 pages of it one random day for kicks. I don't even remember them assigning any readings from the book (they might've been on the syllabus, but you could just watch the lectures and do the homework and you'd be fine).
Yup. At Northwestern, the first course covers the first three chapters. I later went back (~5 years after graduation) and did the fourth chapter and its exercises.
I now have an instructors' guide as well, but still haven't convinced myself to do the fifth chapter, mainly because all of my FP is in SML these days. But I really should...
I really don't want this to come off as flippant - but: fuck yes. Honestly the most important experience in my computer science "self education". I am still working on SICM. Every year I seem have learned just enough more math/physics to grok another page or two.
I'd have taken the intro class to the Joy of Six if I'd had the opportunity. As for SICP, I've started it a couple times, but I regularly get pulled away. Same with PAIP.
Missed an option: No, and this is the first time I've ever seen that Acronym.
I have no idea what it is, and since the poster didn't think it was worth his time to type out four words to define it, I don't see why it's worth my time to scan through the comments here to find out.
So I chose the first option, which at least has "No" in the title.
Honestly I
Don't Know why there is so much hype about it... It just looks like any book that explains building levels of abstraction... I would never say it's an essential..
Yes. SICP is a profound work. I'd argue that it is a profound experience too. As is GEB (Godel Escher Bach). They are both a mind altering typeset form of LSD.
I put it on my to-read list after reading Peter Norvig's review. I read maybe 2% of it and skimmed a lot more. While I'm sure I could learn quite a bit if I seriously studied the whole thing, I'm not sure it would be a good use of my time: most of the contents I already studied in college, though in a quite different approach. There are topics that I'm weak at, but if I decide to learn (say) compilation for real then I'd be better served by reading a book focused on compilation.
In other words, while SICP seems rather hardcore as an introduction to computer science, it feels rather unexciting as a review of my CS undergrad syllabus.