31 ms·
SICP: The only computer science book worth reading twice? (2010)
- docandrew 2y agoI’m working through it now, for someone with a computer engineering, EE or math background I think this is a great resource to get started with CS fundamentals.
- jph 2y agoSICP is available for free: https://web.mit.edu/6.001/6.037/sicp.pdf https://web.mit.edu/6.001/6.037/sicp.pdf If you want to get it elsewhere, the full info is: Structure and interpretation of computer programs by Hal Abelson and Jerry Sussman (MIT Press. 1984. ISBN 0-262-01077-1).
- neilv 2y agoThe article has a broken link for the free copy: https://mitp-content-server.mit.edu/books/content/sectbyfn/books_pres_0/6515/sicp.zip/full-text/book/book.html https://mitp-content-server.mit.edu/books/content/sectbyfn/b... https://web.mit.edu/6.001/6.037/sicp.pdf https://web.mit.edu/6.001/6.037/sicp.pdf I hadn't seen a blessed PDF version until today. Circa 2001, only the HTML version was freely available, and someone converted it to TeXinfo: https://www.neilvandyke.org/sicp-texi/ https://www.neilvandyke.org/sicp-texi/ If anyone wants to work through SICP today, you can run the code in MIT Scheme, or in DrRacket: https://www.neilvandyke.org/racket/sicp/ https://www.neilvandyke.org/racket/sicp/
- xdavidliu 2y agoone thing to note is that the second chapter's "picture language" is not supported in MIT Scheme in 2024. There used to be a package but it's like 2 decades out of maintenance. In Dr. Racket however, there is a package specifically for working through those problems.
- spdegabrielle 2y agoyes https://docs.racket-lang.org/sicp-manual/index.html https://docs.racket-lang.org/sicp-manual/index.html it includes the picture language used in SICP.
- owl_vision 2y agoDr Racket has SICP and HTDP as a teaching pack.
- spdegabrielle 2y agoDrRacket (no space) and yes https://docs.racket-lang.org/sicp-manual/index.html https://docs.racket-lang.org/sicp-manual/index.html
- jgon 2y agoThe texinfo version was I believe the source for the really nice HTML5 version if you want to read it in a browser, but with nice formatting that the MIT original version: https://sarabander.github.io/sicp/ https://sarabander.github.io/sicp/
- kkylin 2y agoFor anyone wishing to try: the maintainers of MIT Scheme no longer provide a .dmg but you can download and build the x86_64 version of MIT Scheme. The current release (v12.1) works on a Mac running Sequoia with Intel CPU or on Apple silicon via Rosetta. But the native code compiler (not necessary for SICP AFAIK) is a little broken. (Anecdotally it worked on macOS prior to Monterey, so maybe an Apple-supplied dependency changed. Haven't tracked down the issue.) All of that is to say: if you do not need MIT Scheme and don't want to fuss with compiling it, then Racket might be a better way to go.
- xdavidliu 2y agomost package managers have it, including apt and brew, so most of the time no need to build your own
- kkylin 2y agoGood point! though my comment about the native code compiler being broken still applies to the brew-installed version
- aag 2y agoThere isn't an active maintainer any more, I'm afraid. And Apple placed restrictions on modifying memory that contains instructions that prevented techniques the compiler relies upon for fast allocation of closures. There are ideas for workarounds, but they would require a lot of work. I'm a huge fan of MIT Scheme, and have used it since 1984, but I would recommend using another implementation these days, especially on Mac. See Scheme.org.
- spdegabrielle 2y agoyes https://docs.racket-lang.org/sicp-manual/index.html https://docs.racket-lang.org/sicp-manual/index.html
- sakras 2y agoJust as a data point, I'd recommend going through it in Racket, which I believe has an explicit SICP mode. I went through it in GNU Guile and it was a pain because there were some minor syntactic differences between Guile and MIT Scheme.
- spdegabrielle 2y agoyes https://docs.racket-lang.org/sicp-manual/index.html https://docs.racket-lang.org/sicp-manual/index.html
- agumonkey 2y agoMy second reading made me dig the footnotes and references, and there's a big world of beauty out there too. IIRC there's a paper where Sussman and some team made a custom design programmable processor to compute celestial bodies properties (trajectories). Mind bending as usual.
- jasonpeacock 2y agoOriginal version: https://mitp-content-server.mit.edu/books/content/sectbyfn/books_pres_0/6515/sicp.zip/index.html https://mitp-content-server.mit.edu/books/content/sectbyfn/b... Javascript version: https://sourceacademy.org/sicpjs/index https://sourceacademy.org/sicpjs/index
- ElD0C 2y agoAnd the Python version: http://www.composingprograms.com/ http://www.composingprograms.com/
- xdavidliu 2y agothis is not the Python version of SICP. It's a different book inspired by SICP. There's no "picture language" in chapter 2, and there's no "metacircular evaluator" and "register machine" in chapter 5.
- ted_dunning 2y agoIt's hard to understand the point without these.
- munchler 2y ago> The computer revolution is a revolution in the way we think and in the way we express what we think. The essence of this change is the emergence of what might best be called procedural epistemology — the study of the structure of knowledge from an imperative point of view, as opposed to the more declarative point of view taken by classical mathematical subjects Ironic, given the increasing use of functional programming in domains where old-fashioned imperative/OO programming used to reign alone.
- namaria 2y agoI think in the context of the book 'procedural epistemology' encompasses all programming, not just what you'd call procedural programming.
- munchler 2y agoHmm, I don’t think so. Functional programming is definitely based on the “declarative point of view taken by classical mathematical subjects”.
- namaria 2y agoI disagree since the book is using a functional programming language to advance the idea that CS is about procedural epistemology as opposed to the declarative stance of maths. The idea that a 'procedural programming paradigm' exists in contrast with a 'functional programming paradigm' is blogspeak imho.
- munchler 2y agoI see. I didn’t realize the book uses a functional language. Thank you for explaining.
- magical_spell 2y agoMy understanding agrees with namaria's. I'm inclined to think that, in the passage you provide, `imperative' means `pertaining to processes' (where processes are those things described by procedures; or, perhaps better put, the meanings of procedures).
- abeppu 2y ago> In fact, I’d go further and say that it’s the only computer science book of that age that I’d happily and usefully read again without it being just for historical interest: the content has barely aged at all. That’s not all that unusual for mathematics books, but it’s almost unheard of in computer science, where the ideas move so quickly and where much of what’s written about is ephemeral rather than foundational. I recall that when MIT stopped teaching with SICP, one of the main claims was that programming now is often not about thinking abstractions through from first principles, and creating some isolated gem of composing definitions. Instead, we interact with and rely on a rich ecosystem of libraries and tools which often have individual quirks and discordant assumptions, and engineering then takes on a flavor of discovering and exploring the properties and limitations of those technologies. I think now, (some) people also are at the point of not even directly learning about the limitations and capability of each tool in their toolbox, but leaning heavily on generative tools to suggest low-level tactics. I think this will lead to an even messier future, where library code which works on (possibly generated) unit tests will bear some fragile assumption which was never even realized in the head of the engineer that prompted for it, and will not only fail but will be incorporated in training data and generated in the future.
- FredPret 2y agoI think just like traditional engineers have to learn physics, computer people should learn these fundamentals for exactly the reason you outline. Then, when you hit the job market, you learn the ecosystem of what other engineers have built and you work in that context. In this way, you can eventually reach extreme productivity. Just look at humanity's GDP over the last 200 years.
- chongli 2y agoI recall that when MIT stopped teaching with SICP, one of the main claims was that programming now is often not about thinking abstractions through from first principles, and creating some isolated gem of composing definitions. Which is a category mistake that they actually address in the lectures. SICP is not a programming course, it’s a computer science course. Computer science is not about computers, let alone programming, just as geometry is not about surveying instruments and astronomy is not about telescopes. When they stopped teaching SICP — in response to the pressure to teach more modern tools — they abandoned their scientific principles to satisfy commercial concerns. They stopped teaching computer science and became a vocational school for the tech industry.
- alabhyajindal 2y agoI really wanted to like SICP but Lisp throws me off. I love Haskell and Standard ML however! Did others have a similar experience? Might be interesting to read a book similar in spirit to SICP but using a different language as a vehicle (No, I don't want to do SICP in JavaScript).
- horeszko 2y agoI think there is a Python version if that floats your boat
- rustybolt 2y agoI really wanted to like SICP and I probably would have if I read it 15 years ago. I started reading it last month and I found it to be too broad. It covers too much interesting mathematical principles and then jumps to the next one right when it starts to get interesting. In other words, it's too shallow. It probably doesn't help that I've seen many courses/documents that are (in hindsight) derivatives from SICP, so I have the nagging thought "not this again" when a topic is introduced in SICP.
- cess11 2y agoIt's written for engineers, they already know the math, but they don't know how to design and implement virtual machines, objects, compilers and whatnot that it shows how to do.
- hluska 2y agoI can identify with that - Lisp throws me off (because I’m not smart enough). But I ended up forcing myself to work through it and learned a tremendous amount because I’m not smart enough to work with a lisp. It felt like I spent so much time just reading through the code that I ended up learning more than I would in a language I’m comfortable with. There is a Python version of SICP. I have never worked through it or even given it more than a cursory scan so this is not an endorsement more just a link to prove it exists: https://wizardforcel.gitbooks.io/sicp-in-python/content/0.html https://wizardforcel.gitbooks.io/sicp-in-python/content/0.ht...
- 2y ago
- owl_vision 2y agoi'd also recommend "Concrete Abstractions: An Introduction to Computer Science using Scheme" by Max Hailperin, Barbara Keiser, Karl Knight. http://www.gustavus.edu/+max/concrete-abstractions.html http://www.gustavus.edu/+max/concrete-abstractions.html
- shrubble 2y agoI concur, I am learning from it now…
- maxhailperin 2y agoSpelling correction on the second author's last name: Kaiser
- owl_vision 2y agoThank you for the correction. pardon my typo.
- tmtvl 2y agoI'll second that recommendation, it's a bit like a gentle mixture between SICP and TAOCP. A very enjoyable read.
- whobre 2y agoI don’t quite get the cult status of SICP. I read it and it’s a fine beginner programming book, but nothing more.
- jgon 2y agoJust so we're clear, this is a "beginner programming book" that has you create a scheme interpreter, then a register machine simulator, then a compiler out of your interpreter that will then have its compiled code run on the register machine simulator, by the final chapter. This is probably the part where you'd step up and post a link to your repo with solutions to the exercises to back up your talk, but generally I only see this sort of casual dismissal from people who haven't actually worked through the book.
- dbtc 2y agoI commend your righteous indignation. Made me smile. Flame on!
- becquerel 2y agoOne aspires to be a hater of such high caliber.
- veqq 2y agoConcrete Abstractions, Schematics of Computation and others from the era (also using Scheme) covered similar ground (and went far further!) SICP is denser and sticks to theory forgoing databases, operating systems and actually implementing scheme in assembly.
- liontwist 2y agoI don’t understand this comment. If you master the material you know more than 90% of engineers in the field.
- aleph_minus_one 2y ago> If you master the material you know more than 90% of engineers in the field. Telling someone that he/she is smarter than 90% of the people is not a praise. :-)
- Upvoter33 2y agoThere are some great books, and every book means something different to each person who reads it. K&R influenced a generation of programmers. Hennessy and Patterson influence a generation of architects. etc. etc. It's not just SICP. But the greater point: a book can be meaningful, and we can always use more good ones.
- projectileboy 2y agoI think this was mentioned in a Paul Graham essay from many years ago, but half the battle in tackling a new area of study is finding out what the best books (or papers) are. There aren’t that many, and yet it’s hard to know what they are if you aren’t already well-versed in the field.
- myleshenderson 2y agoI've been programming for 25 years and have owned the book for about 10 years. I just recently started to work through it and started with Dr. Racket. There are things to love about Dr. Racket: hovering over a variable and visually seeing its connections to other places in the code is really cool. But ultimately I was a bit frustrated that it wasn't vs code. So I stood up an configuration that let me use vs code (cursor actually) to work through the exercises. The LLM integration into cursor is cool as you can give it your code and whatever narrative you wrote and ask for feedback. I am a tiny way through the exercises but having turned my code, the responses that I write, and the feedback that I get from the LLM into a static site. It's been a fun way to spend a little time. For sure, I'm not getting the full benefit of working through SICP just with my own thoughts (without the aid of an LLM), but it's neat to see how you can integrate an LLM into the exercise.
- spit2wind 2y agoProgramming Pearls is another book that rereads well. It's also short, too, which makes rereading it possible.
- scop 2y agoI’m slowly making my way through it a second time and thoroughly enjoying it. The first time through it seemed quite abstract, albeit only because of my completely lack of real world programming. The second time through it a revelation as I now have a strong base of experience through which to understand it (experience which it also, informs!). I am using Elixir’s Livebook to take notes and complete the exercises. It is very helpful to have a live notebook tool while reading it!
- ralphc 2y agoYou're doing the exercises in Elixir and not Scheme then?
- __turbobrew__ 2y agoIt’s interesting, SICP and other many other “classic” texts talk about designing programs, but these days I think the much more important skill is designing systems. I don’t know if distributed systems is consider part of “Computer Science” but it is a much more common problem that I see needs to be solved. I try to write systems in the simplest way possible and then use observability tools to figure out where the design is deficient and then maybe I will pull out a data structure or some other “computer sciency” thing to solve that problem. It turns out that big O notation and runtime complexity doesn’t matter the majority of the time and you can solve most problems with arrays and fast CPUs. And even when you have runtime problems you should profile the program to find the hot spots. What computer science doesn’t teach you is how memory caching works in CPUs. Your fancy graph algorithm may have good runtime complexity but it completely hoses the CPU cache and you may have been able to go faster with an array with good cache usage. The much more common problems I have is how to deal with fault tolerance, correctness in distributed locks and queues, and system scalability. Maybe I am just biased because I have a computer/electrical engineering background.
- llm_trw 2y agoYou're in luck. Part 5 of the book is about building a virtual machine to run lisp simalated at the register lelvel: https://mitp-content-server.mit.edu/books/content/sectbyfn/books_pres_0/6515/sicp.zip/full-text/book/book-Z-H-32.html#%_sec_5.2 https://mitp-content-server.mit.edu/books/content/sectbyfn/b... Writing a network between n such machines is left as an exercise to the reader.
- KerrAvon 2y agoIf you knew how to design programs you could run it all on a single box and wouldn’t have to design “systems.” I’m being slightly facetious, but only slightly. If you really think everything is solvable with arrays, you are not going to scale well and of course you’re going to need to throw a lot more hardware at the problem.
- __turbobrew__ 2y agoMy argument is that 90% of problems can be solved with arrays, 5% of problems can be solved with memoization, 3% of problems can be solved with b-trees, and 2% of problems with other data structures. It is good to know that solutions to the 2% exists, but what we should be focusing on is writing the simplest code possible which solves the problem and then only optimize afterwards using a profiler. God forbid you have to work on some codebase written by someone who believes they are the second coming of haskell with crazy recursion and backtracing, monads, red black trees, and a DSL on top of the whole thing. You are right that many problems can be solved with a single box, but my argument is that you do not need fancy algorithms to solve problems on a single box. We should strive to use single boxes whenever possible to reduce complexity. Computation is designed by humans to serve humans, we should make it as easy as possible for humans to understand. I’m probably going to start a flamewar here, but this is why simple solutions like UNIX and golang have prevailed in the past. Simple code is easy to understand and therefore it is easy to modify and reason about. Some people think simple means that you decompose programs into the smallest possible functional parts, but simple to me is a 500 line main function.
- taeric 2y agoCurious to hear folks opinion on the newer Software Design for Flexibility: How to Avoid Programming Yourself into a Corner (https://www.amazon.com/gp/aw/d/0262045494 https://www.amazon.com/gp/aw/d/0262045494)?
- golly_ned 2y agoIt’s a much, much denser successor to sicp. I hadn’t succeeded in self-studying with it despite strong lisp/scheme chops and strong affinity for sicp.
- taeric 2y agoI have a copy. Found it fun, but not quite as mind shifting. I think I need to try it again, but I am curious how others feel.
- MikeTaylor 2y agoJust dropping in to say that The Elements of Programming Style is worth reading three times — and I have read it many more times than that, and benefitted from it. Here's my review (from 2010) if you're interested: https://reprog.wordpress.com/2010/03/06/programming-books-part-2-the-elements-of-programming-style/ https://reprog.wordpress.com/2010/03/06/programming-books-pa...
- CuriousCosmic 2y agoOh and here I thought you were talking about Elements of Programming by Stepanov and McJones which tbh I'd give the same recommendation/review. https://elementsofprogramming.com/ https://elementsofprogramming.com/
- debo_ 2y agoSICP helped me understand early on that there were many models of programming, even though I'd learned a limited number in my undergraduate. It was one of the books that helped me feel equipped to read the docs of any language, library or framework and have some notion of how to orient myself.
- WillAdams 2y agoOne of the best programming classes I had in college was a comparative languages course where multiple languages were covered, each in two week or so blocks.
- anon115 2y agoits watever
- jnordwick 2y agoI took cs61a at Berkeley as my very first computer science class I couldn't program I never tried to so scheme was my first language. My ta told me that everybody should take the class twice when you first come in and when you're graduating. When you first take it especially if you know other languages like C at the time you don't get the full depth of the problems you're given a great introduction and you think you understand everything but you don't realize the depth of complexity. Message passing the metacircular evaluator, continuations as the basis of all flow control, etc You think they are neat tricks that you understand the curriculum because you can do the homework you don't understand how those neat tricks are really the basis of everything else you'll do. When you're graduating you've had time to go through all your classes you realize just how foundation was principles are and you get so much more out of the book. Well I didn't take the class a second time I need help grade and TA for a couple semesters. I work as a quant developer and in trading now and even though my field has nothing to do with that I still think it's the basis of me as a developer.
- golly_ned 2y agoMy same experience. For much of the rest of the cs curriculum I felt like we had already to some extent covered the main ideas in 61a with sicp.
- globular-toast 2y agoMy favourite part of SICP and something that has stuck with me for years is the idea of "wishful programming". That is where you build something top-down by simply wishing you had the lower-level routines. Then, of course, you actually go and build those lower-level routines until you reach the bottom. I find this way of thinking works really well with test-driven development. Write a test against functionality you wish you had, then go and fulfill that wish. Most developers seem to build stuff bottom-up and then end up with something that isn't really what anyone wished for.
- Qem 2y agoThe Smalltalk world has great support for this, through coding in the debugger. You should try Pharo.
- WillAdams 2y agoInterestingly, Dr. Donald Knuth used pretty much that approach when writing TeX --- he started by writing out the sort of formatting/tagging which seemed appropriate, then theorizing about the sort of programming which would be appropriate for markup (hence macros), then worked on the implementation. I've been trying a similar thing for my own effort to create a library for modeling G-code in OpenSCAD --- hopefully with the recent re-write in "pure" OpenPythonSCAD it will become something usable.
- wruza 2y agoThey do that because their wish is performance and naturalness. You may accidentally wish something you don’t yet know the true nature of, and this will create a fragile mess at the bottom. It usually does, cause algorithmic nature of things is rarely intuitive. Starting from the bottom is like starting from quarks that you have rather than from “I want magic to exist”. Well it does not. You reach the bottom and there’s quarks instead of magicules and you’ve lost all context clues on the way which could help to convert between two physics. Both approaches have their use, because sometimes you have to be bold with your wishes to solve a deep problem. But personally I prefer magic to be packed into the before-topmost layer. I.e. build from the bottom up, and then, just before the business logic, create a convenience magic layer that translates to/from business speak. It becomes adjustable and doesn’t induce a tangled mess all the way down.
- rednafi 2y agoThis is great, but it’s not what I get paid for. I’ve yet to work at a place where I thought, “If only I had read SICP, things would be easier.” I work with distributed systems, writing business logic and dealing with infrastructure concerns. For me, learning about databases, quirks of distributed systems, and patterns for building fault-tolerant services is more important than reading the nth book on structuring programs, deciding which algorithm to use, or figuring out whether my algorithm has O(1) or O(n) complexity. This doesn’t mean CS fundamentals aren’t important—they are—but I work in a different space. I’d get more value out of reading Designing Data-Intensive Applications than SICP. If I were in the business of building frameworks or databases, I’d probably be the target audience.
- upghost 2y agoHot take: SICP and SD4F "considered harmful (without counterpoint)"*. Why? The modus operandi of problem solving in these books is object oriented programming masquerading as functional programming, and it is presented as a _neutral_ beginner book. It is _not neutral_. This is a very opinionated approach to programming. To be fair, I do not believe the authors intended for this style of programming to be taken as gospel, but it is often presented _without counterpoint_. The most powerful technique introduced -- implementing complex behavior via extensible polymorphic generics -- is virtually unmaintainable without a compiler-supported static type checker. You would know that if you ever tried to implement the code yourself in a dynamic language of your choice. The ramifications of these choices can be felt far and wide and are largely unquestioned. Ironically, they make code hard to understand, hard to extend, and hard to maintain. I need to reiterate, I do not believe the intention of the authors was to suggest these ideas should be used beyond a pedagogical setting, but they often are. As a specific critique to SD4F, which states as a goal making code more resilient by emulating biology, I would point to Leslie Lamport's talk on logic vs biology[1]. I would add that I think SICP would be fine if it were taught in tandem with Paradigms of Artificial Intelligence Programming by Peter Norvig[2]. PAIP offers a completely different approach to solving problems, also using lisp. This approach is much closer to constructing a language to model a problem and then solving the problem symbolically using the language created. Areas that use OO techniques, such as the chapter in CLOS, are clearly marked as such. In other words, I say "SICP considered harmful" because thrusting it upon an eager newcomer as a trusted neutral guide to beginner coding (without offering any counterpoint) could set them back by a decade, filling their head with "functional object oriented programming" concepts that don't translate well to industry or CS. [*]: I say this as someone who has thoroughly studied both books, implemented the code, taken Dave Beazely courses to have the information spoon fed to me (dabeaz is awesome btw, take all his stuff) and used the techniques in production code bases. [1]: https://lamport.azurewebsites.net/pubs/future-of-computing.pdf https://lamport.azurewebsites.net/pubs/future-of-computing.p... [2]: https://github.com/norvig/paip-lisp https://github.com/norvig/paip-lisp
- SleepyMyroslav 2y agoI would say that after 20+ years career OO plus functional elements have been a good default. Maybe I missed opportunities where symbolic computations were important and limited myself with languages like C++ that prefer OO/functional approaches... I can't go back and try something else to know =) I might agree with your hot take in sense that leaving choice is important though.
- lincpa 2y ago[dead]
- Avid_F 2y agoThat and the art of computer programming
- Jiahang 2y agoand CSAPP i think
- Iwan-Zotow 2y agoTAOCP
- freethejazz 2y agoI haven’t seen it in the comments yet, but you can watch Abelson and Sussman teaching the material from this book from recorded lectures in 1986. I still find their description of how to create and group abstractions in various layers to be useful personally and as a mentor. (In the videos, lesson 3A, 1:07:55) https://m.youtube.com/playlist?list=PLE18841CABEA24090 https://m.youtube.com/playlist?list=PLE18841CABEA24090
- selimthegrim 2y agoThe Kabbalah joke gets me every time.
- gompertz 2y agoThanks for sharing this. It's crazy to see videos like this and think how these people had no idea what was coming in the future.
- virtuallynathan 2y agoAlways fun to see one of my professors from the quite tiny, but awesome computer science department at St Andrews on HN!
- nomilk 2y agoI considered reading SICP recently but this changed my mind: > It's old and feels old. originally in scheme, they recently re released the book in JavaScript which is more approachable to today's audiences and there are still good things in there about encapsulation and building dsls. ymmv. Though the language and programming design concepts hold up, we're playing at higher levels of abstraction on more powerful machines and consequently the examples sometimes seem too tiny and simple. I had studied economics in a similar way, but learning slightly old/outdated ideas demotivated me - I was much more interested in learning what works and what's considered the best way to do things, not what had been considered a good idea at some point in the past. I don't want to be a downer on SICP (especially since I haven't even read it), but I hope this info might help others (or elicit a strong refutation).
- crystal_revenge 2y agoScheme as basically an implementation of the untyped lambda calculus will eternally be a good frame work to think about the problems of computation in. In the more practical area Racket (the most modern Scheme) has basically any practical functionality you would want, while amazingly remaining a platform for an incredible amount of experimentation in computation and programming language theory. But SICP is a book that is for people interested in the study of computation what programming languages can be. If you're worried about getting a job in software it won't be all that useful, but it will remain a classic for anyone interested in engaging in creating the future of software.
- cess11 2y agoSure, SICP is not a good book for people wanting to do rote learning, imitation, 'best practice' while ignoring the history. It's for people that would like to learn rather advanced programming techniques and foundational ideas in computer science.
- deleted 2y ago[deleted]
- soup10 2y agoI picked up SICP expecting to read something really interesting or profound with the way it's been hyped up over the years however it's more of a how-to manual for working with Scheme/LISP and frankly that didn't interest me. Unfortunately most people have come to accept that LISP isn't a particularly effective way of programming even if some people get really excited by the idea of mutable and interchangeable data and code it's just not as powerful as they make it out to be and the obfuscation of program flow and execution and the lack of separation/delineation of data and code proves to be a hinderance more often than it is helpful. This doesn't discount LISP's contribution to computer science historically and how it's influenced modern day language design over the years, just that in my opinion LISP/SCHEME is more of a historical curiosity than a modern day guide to effective programming. (And certainly one that has no place as the introductory class at MIT). Anyway I've said something negative about SICP so prepare for this to be downvoted to the bottom :)
- rurban 2y agoMany classics are worth reading twice. Knuth, Tanenbaum, Stephens, PAIP, ...
- anonzzzies 2y agoNext to SICP, I like the entire "The Little *" series as reading twice (or more) material. And Types and Programming languages. For applicable (in what I do anyway) CS. But not only reading though; implementing as well; I need to repeat these things otherwise I forget parts. I myself, but probably because I knew and respect the guy, I reread the works of Dijkstra ever so often; books + papers. Not really applicable anymore, but good for the brain and he was a good writer (imho).
- jll29 2y agoSICP is the best book to read as one's first book when studying computer science. After many years of hobbyist programming (and consuming 'structured programming' books as well as languages from Pascal to Common LISP) we used Abelson & Sussmann at my undergraduate comp. sci. course, and it was eye-opening. It demonstrates the simplicity, beauty and interactivity of Scheme while teaching you that computer science is the layering of different kinds of abstractions (from procedural abstraction and data abstraction, over defining your own (domain specific) language and implementing a compiler for it to defining new hardware in software). All of it seems so effortless, how only true masters can make things look like. Make sure you buy the second edition, not the first or more recent ones, however (which use Python instead of Scheme - ugh).
- ingen0s 2y agoPerfect book and if you don’t have a version - get it!
- eatonphil 2y agoI've read DDIA twice and I plan to read it again when the new edition comes out. And I will probably read it every couple of years again too. I can't really think of any other book I feel so strongly about personally.
- michelpp 2y agoMy twice reading list: - Godel, Escher, Bach - Hoffstadter - The Soul of a New Machine - Kidder - The Emperor's New Mind - Penrose - The Connection Machine - Hillis - Algorithmics - Harel
- rongenre 2y agoI love SICP, but in industrial software I'd point to "The Mythical Man Month".
- ngcc_hk 2y agoThere are many layers and dimensions. As pointed out that these days systems design, integration and how to interface is more important (and in fact in older days as well not sure why it becomes these days as system analysis is a job higher than programmer usually, at least 3-4 decades ago). We need someone knowing this, just like we need someone to run the nuclear plant we use. But we do not need much those but we need more how to use electricity. Hence unlike another post physics are not the key even if it is more foundational. For personal growth, it might be still though. But frankly lisp is such a non-multi-system language, it has a hard time to deal with external world by its nature. It can be done as lisp is really the god level programming language. But as said it is NOT used by the gods for a reason. We need find a system level language to express ourselves so that we can stand in giants. We need giants but no need to be one.
- starlite-5008 2y ago[dead]