Author here - happy to answer questions and address feedback. I suspect I didn't explain Lisp-in-Lisp as well as I need to, but maybe it's enough to get non-Lispers intrigued. :)
what about the people who did not do a math major. Is this a book they can get through?
I tried once and saw that I had to read two other books before I could even read chapter one. one for discrete mathematics and the other for calculus. do you have any tips for the people in my situation?
Not sure without knowing more of your background - provisional answer is "maybe." Some parts of Ch.1 are certainly math-heavy. The video lectures are quite accessible. Did you study, say, ~1 year of calculus?
yes, 1 year of calculus. differentiation and integrals were the only two calculus topics that I recognized from that chapter. at the time when I was trying to get through sicp I wasn't sure whether the pay off was worth the effort of covering all those math topics and I wanted to learn other programming related topics as well with my time.
At least up to 1.3.3, if you've already done single-variable calculus, the math isn't bad - it's stuff you likely saw before (if a while ago).
It seems heavier on math than it really is because (I believe) the authors want the reader to see the parallels between math notation (functional, declarative, concise) and Lisp implementation (also functional, declarative, and quite concise).
I agree, math is used as a domain for black box abstraction for the same reason banking is used for the example domain for concurrency and graphics for data abstraction - the domain provides good examples for trivial implementations.
A person no more needs extensive understanding of mathematics than they need such understanding of accounting or image processing.
The big idea for SICP is that mathematics is just domain knowledge. In the same way that a programmer does not have to be an MD to write software that helps physicians, a person does not need to be an expert in Mathematics to write software that solves maths problems.
That said, domain knowledge is helpful, but so is being able to work in fields which are over one's head. The big ideas are not the maths, but the abstractions which are applicable to many fields.
My advice is focus on the parts you understand [this is Knuth's recommendation for The Art of Computer Programming as well] and plan on coming back later as your knowledge increases. SICP can be digested in small chunks over time.
These can be good precursors before starting on SICP. I have to say, though, that I have never felt comfortable with LISP's syntax. The parentheses and the prefix notation are convenient for the parser, not the programmer. Pyret http://www.pyret.org/index.html might be a step in the right direction.
I am a big fan of HtDP, and Felleisen's in-progress 2nd edition of HTDP is here: http://www.ccs.neu.edu/home/matthias/HtDP2e/ . It contains many improvements over the first (completeness however is not among them).
That said, HtDP's focus is very different from SICP, and I would not sequence one before the other. HtDP focuses on a methodology for writing robust maintainable software. It emphasizes specifications and testing and functional procedures.
SICP is focused on computer science and emphasizes much higher levels of abstraction - e.g. the *nix signal processing model, logic programming, constraint programming, stack machines and dealing with concurrency. It is more directly an introduction to Computer Science [despite Ableson's questioning the utility of the term 'computer science'] whereas HtDP is more of an introduction to the practice of programming.
Philosophically, SICP is ok with the idea of placing the student in over their head, e.g. the digital logic simulator and various mathematical examples treat digital logic and mathematics and banking as domain knowledge that the programmer might not have, but does not need in order to create sound abstractions.
[And Kickzales's course on Coursera was I awesome, I took the first version last summer.]
When I first read the title/url I got excited. I remember on the thoughbot podcast, Ben Orenstein spoke about going to Cape Cod with some people to go through SICP in a nice but isolated setting. I thought something like that was being organized on a larger scale...
Still a very good article, with great arguments for why the book is a must-read. Great links too. I would also include something easy like Realm of Racket (or Land of Lisp) as a good first-date before shacking up with SICP.
Hacker Retreat does look great though. Wish I had the free time to give it a try.
Can't say Berlin is an isolated setting, nor does it feel/look like Cape Cod, but it is nice - if you like cities, it's got something of everything. :) And the summer here is fantastic.
SICP is always "on" at Hacker Retreat - I've always got SICP buffers open. If you're able to work remotely from Berlin, consider coming to Batch-02 this summer.
If folks are interested in having a person to talk to while doing SICP, we're doing it in the iPad app we released last Thursday. We were going to do a Show HN, but hey, HN's already talking SICP!
The setup is basically like private music lessons. We pair you with a somewhat more advanced student also doing SICP. The deal is to
(1) Work on SICP by yourself during the week
(2) Once a week, discuss the material with your more advanced partner. The app builds in a videochat + whiteboard communication tool (you can see it in the app screenshots).
(3) When you get about a month in, also start discussing with someone who is just starting out. When you help that person understand, it very much improves your own understanding.
Basically, it gives you good discussion with people who are genuinely interested in SICP.
That's an excellent idea. I'd be very interested in having this sort of help, and later passing it forward.
The actually app however seems to only run on one make of tablet (that I don't happen to own). I could be wrong, but it seems to me that most people'll be doing SICP exercises on a real computer, rather than a tablet. Why did you decide not to do, say, a webapp - or even to just assign the pairs and let them use whatever communication medium they have in common (skype, hangouts, IRC, whatever)?
Mostly because a tablet is very well suited to the whiteboard, and we find that the whiteboard _really_ helps for this kind of working collaboration.
It makes it really easy to gesture and discuss visually.
As far as iPad vs Android - that's just because we have to start somewhere. Also, I worked at Apple for 7 years, so it's definitely the environment I'm quickest at programming.
That said, if people actually like what we're doing, who knows. The main point is the conversation, the tech just enables it.
(Oh - and yeah, you definitely do the SICP exercises on the computer. That's by yourself, though. When we chat once a week, we do often write out snippets of code or problems, but the use of the interpreter already happened.)
Folks, you don't need proprietary software or an iThing to get help with SICP. Hop on #scheme on freenode and check out http://schemers.org/ for resources.
I do love IRC, but what Understudy gives you is a one-to-one relationship with another person who cares.
It means that Thursday evening, when you're tired, it's easier to pick yourself up and work, because doing so gets you a _better_conversation_ on Saturday. I'm a cellist - this comes from private music lessons (and also karate).
Are people on #scheme pretty open to newcomers coming and and asking random questions about SICP?
The problem I've had when asking similar questions on another forum (not on #scheme) was that people would often assume I was trying to get help on homework and rudely blow me off (I've been out of uni for over a decade). So I stopped asking for help, and muddle through on my own.
Cool idea, will be curious to see how it goes (don't own iStuff so can't directly participate).
Live remote video-learning, I've found, tends to require a good friend of comparable skill level to work. If you discover that strangers can make this work sustainably, that's definitely interesting and important.
I think that's true if your setup is symmetric. You and your friend have to go at the same pace, you get anxious about holding them up or coming off as dumb, etc.
This is an asymmetric setup. You talk through whatever material the less-advanced student got through that week. More like YC office hours.
For anyone interested, Paul Snyder and I are running a SICP study group going on right now. We also have online and in person meetings in Philadelphia and King of Prussia. We are currently doing one minor section every month, which averages out to roughly one homework question every 3 days.
For anyone interested we will help you get setup and started, no prior programming needed.
We are running section 1.3 this month, so there is not much to catch up! Also, anyone who wants to work it their own pace is welcome too!
Our group, the LA Computer Science Reading Group has been interested in doing SICP for a while. For those in Los Angeles who are interested in joining us, here's the link to the meetup group: http://csrg.org
I took 5 assembly-based courses. To make a compiler, all you have to know is assembly, but I took a compiler course, too. You don't need any theory courses to make a compiler, just assembly. If you know theory and you do not know assembly, you cannot make a compiler.
You think I lie? Can you make a compiler? No, right? I made a compiler. I tell the truth.
It doesn't really require any math… some exercises and examples do require math, but you can just skip them. The first chapter has a lot more of that than the rest. It's very much not essential.
To give an example, the hardest math I can remember is one exercise where they ask you to _prove_ the equation listed if you search for "closed form" at http://en.wikipedia.org/wiki/Fibonacci_number .
I'm relatively sure that the point of this exercise was just to drive home that performance characteristics of a problem can be non-obvious. We just finished making an O(n) implementation of Fibonacci numbers and feel pretty good about it, but oh wait, you can actually do it in O(1).
However, to literally answer your question, the math used in exercises mostly tops out at polynomial algebra (like, adding X^2 + 3X + 1 to 3X^2 + 3), with a little bit of calculus - namely taking derivatives (and maybe integrals? I forget) of polynomials. The calculus is not used to solve a problem - rather you're implementing a program that lets the user take derivatives of polynomials.
I'd have to disagree - the math is important, and lays a foundation for functional/declarative programming. One major lesson of Chapter 1 (where the math is most evident) is conceptually tying math (and its notations) with functional, declarative programming. Math still shows up in Chapters 2 (e.g. generic operations, polar vs. rectangular coordinate system math) and 3 (streams). It can't be skipped over without missing a lot of lessons.
You'll need the equivalent of 1 semester of calculus, I'd guess, including working knowledge of pre-calculus material like sums of series (sigma notation). Try poking around Amazon.com for a highly-reviewed book, or use Khan Academy content.
You might also try starting with the videos, which are more-code, less-equations. But to get maximum benefits, one must do the exercises (at least some of them), so you'll still need the book.
I have a very specific question about starting out on SICP. A few months back, I worked through roughly half the exercises in the book. I got stuck on 2.2.4 (a picture language)[1] and was unable to run any of the examples or test any of the exercises.
Is there some prerequisite library for these exercises? Or am I missing the point and these are not actually intended to be run?
I had to make do with Einstein. I also discovered afterwards you can copy and paste images directly into DrRacket and pass them round like anything else - you might (very big guess) be able to create the wave and rogers primitives this way.
Good question - when I got to that part, I couldn't get the picture language to run either and just wrote code that I compared with other online solutions. I just took a look at the MIT Press website for their SICP code:
http://mitpress.mit.edu/sicp/code/index.html
...but don't see the code needed there to draw graphics. Eli's online solution did, I believe, manage to get graphics working with a non-MIT-Scheme Scheme. But it's not necessary to have running code here to get the benefits of the exercises (unlike later in Chapter 3 and 4!).
1 uses Robert Harper's Practical Foundations for Programming Languages (and was taught by him) and 2 uses PFPL plus Benjamin Pierce's Types and Programming Languages. Both courses have lecture notes and readings for each session as well as homework assignments with solutions which ought to make them straightforward to go through on your own.
I found these by doing some Googling and evaluating various forums/Stack Exchange posts; if anyone has any better suggestions I would love to hear them. (I haven't done SICP in depth and now, of course, I'm considering putting this plan on hold and doing SICP instead...)
Thanks for the links -- wish I could take those courses in person.
I haven't found anything like SICP (thus my question), but I feel compelled to mention two great practical repos I discovered yesterday thanks to HN, both of which are teaching me a lot about practical type systems:
Thanks, those are good links too. I seem to recall seeing something similar to the first link, except in Haskell, but I can't seem to find it right now.
The article recommends mit-scheme. Anyone know how to get that working as a Sublime Text build? From what I can tell, to invoke mit-scheme on a file, you redirect stdin, a la:
mit-scheme < foo.scm
This doesn't play so nicely with the ST2 build system, which seems to assume the input will be simply be a filename arg. E.g., it's assuming you can do:
Sorry, wish I could help, I've always run MIT-Scheme on Linux. If you figure it out, please leave commentary here, on the article, and/or send me link to your blog post w/ instructions, thanks.
FUCK THAT SHIT I CAN'T STAND ANYMORE FUCK THAT SHIT FUCK IT FUCK IT FUCK IT FUCK THAT SHIT FUCK IT FUCK IT FUCK IT FUCK THAT SHIT FUCK IT FUCK IT FUCK IT FUCK THAT SHIT FUCK IT FUCK IT FUCK IT FUCK THAT SHIT FUCK IT FUCK IT FUCK IT FUCK THAT SHIT FUCK IT FUCK IT FUCK IT FUCK THAT SHIT FUCK IT FUCK IT FUCK IT FUCK THAT SHIT FUCK IT FUCK IT FUCK IT FUCK THAT SHIT FUCK IT FUCK IT FUCK IT FUCK THAT SHIT FUCK IT FUCK IT FUCK IT FUCK THAT SHIT FUCK IT FUCK IT FUCK IT FUCK THAT SHIT FUCK IT FUCK IT FUCK IT FUCK THAT SHIT FUCK IT FUCK IT FUCK IT FUCK THAT SHIT FUCK IT FUCK IT FUCK IT FUCK THAT SHIT FUCK IT FUCK IT FUCK IT FUCK THAT SHIT FUCK IT FUCK IT FUCK IT FUCK THAT SHIT FUCK IT FUCK IT FUCK IT FUCK THAT SHIT FUCK IT FUCK IT FUCK IT FUCK THAT SHIT FUCK IT FUCK IT FUCK IT FUCK THAT SHIT FUCK IT FUCK IT FUCK IT FUCK THAT SHIT FUCK IT FUCK IT FUCK IT FUCK THAT SHIT FUCK IT FUCK IT FUCK IT FUCK THAT SHIT FUCK IT FUCK IT FUCK IT FUCK THAT SHIT FUCK IT FUCK IT FUCK IT FUCK THAT SHIT FUCK IT FUCK IT FUCK IT FUCK THAT SHIT FUCK IT FUCK IT FUCK IT FUCK THAT SHIT FUCK IT FUCK IT FUCK IT FUCK THAT SHIT FUCK IT FUCK IT FUCK IT FUCK THAT SHIT FUCK IT FUCK IT FUCK IT FUCK THAT SHIT FUCK IT FUCK IT FUCK IT FUCK THAT SHIT FUCK IT FUCK IT FUCK IT FUCK THAT SHIT FUCK IT FUCK IT FUCK IT FUCK THAT SHIT FUCK IT FUCK IT FUCK IT FUCK THAT SHIT FUCK IT FUCK IT FUCK IT FUCK THAT SHIT FUCK IT FUCK IT FUCK IT FUCK THAT SHIT FUCK IT FUCK IT FUCK IT FUCK THAT SHIT FUCK IT FUCK IT FUCK IT FUCK THAT SHIT FUCK IT FUCK IT FUCK IT
if you're in London and looking for someone to share in your SICP adventure, check out the London SICP study group: http://www.meetup.com/London-SICP-Study-Group/ we just simmered down for the time being, but parallel groups are planning to start soon.
Totally on a tangent, but I'd love to see a 'Hacker Retrete' style session targeted at hackers / devs that have jobs.
Something on the order of 1 or 2 weeks in length, super compressed that gives working devs a chance to learn something new or explore something outside of their normal job. I'd love to do something like this, particularly in an exotic location, but against a set amount of time that doesn't require me to quit my job.
As a coding-vacation? Or as something that blends well with remote work?
We've adjusted the format of the current Hacker Retreat to accommodate people working (remotely, on their startup, etc) - 20% of your time is committed to learning, the rest of the time is up to you. The time-span is over 2 months minimum. We're currently taking applications for the Batch-02 starting in May/June.
Super-compressed, 1-2 week retreats are something we've thought about, especially for advanced topics like data science and functional programming...may do it later, but not this summer.
I was thinking coding vacation. I perform improv on the side, and it's not unheard of to have intensive 'improv camps' for adults over the summer where performers go for up to a week at a location to focus on improving performance skills.
I love the hack camp idea and chance to fully dive into something with like minded people, it just needs to fit into something I can spend my vacation days on.
Yep, it would be fun to do that for code - we're thinking of different models and timings for Hacker Retreat. Consider sub'ing to our email list to stay in touch, thanks.
Much better to have a REPL handy - like order-of-magnitude better. :) The further in the book you go, the more you need to write, run, tinker and test to check your understanding(s).
64 comments
[ 0.29 ms ] story [ 118 ms ] threadIt seems heavier on math than it really is because (I believe) the authors want the reader to see the parallels between math notation (functional, declarative, concise) and Lisp implementation (also functional, declarative, and quite concise).
A person no more needs extensive understanding of mathematics than they need such understanding of accounting or image processing.
That said, domain knowledge is helpful, but so is being able to work in fields which are over one's head. The big ideas are not the maths, but the abstractions which are applicable to many fields.
My advice is focus on the parts you understand [this is Knuth's recommendation for The Art of Computer Programming as well] and plan on coming back later as your knowledge increases. SICP can be digested in small chunks over time.
You should consider adding a TL;DR at the beginning, to explain what it is all about.
These can be good precursors before starting on SICP. I have to say, though, that I have never felt comfortable with LISP's syntax. The parentheses and the prefix notation are convenient for the parser, not the programmer. Pyret http://www.pyret.org/index.html might be a step in the right direction.
That said, HtDP's focus is very different from SICP, and I would not sequence one before the other. HtDP focuses on a methodology for writing robust maintainable software. It emphasizes specifications and testing and functional procedures.
SICP is focused on computer science and emphasizes much higher levels of abstraction - e.g. the *nix signal processing model, logic programming, constraint programming, stack machines and dealing with concurrency. It is more directly an introduction to Computer Science [despite Ableson's questioning the utility of the term 'computer science'] whereas HtDP is more of an introduction to the practice of programming.
Philosophically, SICP is ok with the idea of placing the student in over their head, e.g. the digital logic simulator and various mathematical examples treat digital logic and mathematics and banking as domain knowledge that the programmer might not have, but does not need in order to create sound abstractions.
[And Kickzales's course on Coursera was I awesome, I took the first version last summer.]
Still a very good article, with great arguments for why the book is a must-read. Great links too. I would also include something easy like Realm of Racket (or Land of Lisp) as a good first-date before shacking up with SICP.
Hacker Retreat does look great though. Wish I had the free time to give it a try.
SICP is always "on" at Hacker Retreat - I've always got SICP buffers open. If you're able to work remotely from Berlin, consider coming to Batch-02 this summer.
Understudy: https://itunes.apple.com/us/app/understudy/id782635884
The setup is basically like private music lessons. We pair you with a somewhat more advanced student also doing SICP. The deal is to
(1) Work on SICP by yourself during the week
(2) Once a week, discuss the material with your more advanced partner. The app builds in a videochat + whiteboard communication tool (you can see it in the app screenshots).
(3) When you get about a month in, also start discussing with someone who is just starting out. When you help that person understand, it very much improves your own understanding.
Basically, it gives you good discussion with people who are genuinely interested in SICP.
We've been running it in beta for a while – see https://twitter.com/understudyapp .
In all honesty, though, this sounds like a really cool idea. I may check it out.
Conversation isn't zero sum.
The actually app however seems to only run on one make of tablet (that I don't happen to own). I could be wrong, but it seems to me that most people'll be doing SICP exercises on a real computer, rather than a tablet. Why did you decide not to do, say, a webapp - or even to just assign the pairs and let them use whatever communication medium they have in common (skype, hangouts, IRC, whatever)?
It makes it really easy to gesture and discuss visually.
As far as iPad vs Android - that's just because we have to start somewhere. Also, I worked at Apple for 7 years, so it's definitely the environment I'm quickest at programming.
That said, if people actually like what we're doing, who knows. The main point is the conversation, the tech just enables it.
(Oh - and yeah, you definitely do the SICP exercises on the computer. That's by yourself, though. When we chat once a week, we do often write out snippets of code or problems, but the use of the interpreter already happened.)
It means that Thursday evening, when you're tired, it's easier to pick yourself up and work, because doing so gets you a _better_conversation_ on Saturday. I'm a cellist - this comes from private music lessons (and also karate).
See also http://en.wikipedia.org/wiki/Bloom's_2_Sigma_Problem . In that study, the median person learning one-to-one performed at the 98th percentile in a control group. That's huge!
The problem I've had when asking similar questions on another forum (not on #scheme) was that people would often assume I was trying to get help on homework and rudely blow me off (I've been out of uni for over a decade). So I stopped asking for help, and muddle through on my own.
Why does your app have this rating? Don't get me wrong, I love Lisps as much as the next person, but...
More seriously, is it because of the video-chat feature?
Yes. :-) When people tutor kids, they make sure there's always another adult in the room. That's hard for us, so no kids.
Live remote video-learning, I've found, tends to require a good friend of comparable skill level to work. If you discover that strangers can make this work sustainably, that's definitely interesting and important.
This is an asymmetric setup. You talk through whatever material the less-advanced student got through that week. More like YC office hours.
For anyone interested we will help you get setup and started, no prior programming needed.
We are running section 1.3 this month, so there is not much to catch up! Also, anyone who wants to work it their own pace is welcome too!
http://www.meetup.com/Clojadelphia/events/172933722/
Paul hasn't put up the info for the 1.3 online session yet, join the Clojadelphia group to get updates when he does.
xuanji.appspot.com/isicp/
You think I lie? Can you make a compiler? No, right? I made a compiler. I tell the truth.
To give an example, the hardest math I can remember is one exercise where they ask you to _prove_ the equation listed if you search for "closed form" at http://en.wikipedia.org/wiki/Fibonacci_number .
I'm relatively sure that the point of this exercise was just to drive home that performance characteristics of a problem can be non-obvious. We just finished making an O(n) implementation of Fibonacci numbers and feel pretty good about it, but oh wait, you can actually do it in O(1).
However, to literally answer your question, the math used in exercises mostly tops out at polynomial algebra (like, adding X^2 + 3X + 1 to 3X^2 + 3), with a little bit of calculus - namely taking derivatives (and maybe integrals? I forget) of polynomials. The calculus is not used to solve a problem - rather you're implementing a program that lets the user take derivatives of polynomials.
You might also try starting with the videos, which are more-code, less-equations. But to get maximum benefits, one must do the exercises (at least some of them), so you'll still need the book.
[1] http://en.wikipedia.org/wiki/Concrete_Mathematics
Is there some prerequisite library for these exercises? Or am I missing the point and these are not actually intended to be run?
1. http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-15.html...
Check it out here:
http://www.neilvandyke.org/racket-sicp/
The DrRacket SICP package has only one primitive image, "einstein".
...but don't see the code needed there to draw graphics. Eli's online solution did, I believe, manage to get graphics working with a non-MIT-Scheme Scheme. But it's not necessary to have running code here to get the benefits of the exercises (unlike later in Chapter 3 and 4!).
Something challenging yet doable for a determined independent student.
I've been looking around for a good way to learn type theory via self-study, and my current plan is to go through these courses on my own:
1) http://www.cs.cmu.edu/~rwh/courses/typesys/ 2) http://ttic.uchicago.edu/~pl/classes/CMSC336-Winter08/
1 uses Robert Harper's Practical Foundations for Programming Languages (and was taught by him) and 2 uses PFPL plus Benjamin Pierce's Types and Programming Languages. Both courses have lecture notes and readings for each session as well as homework assignments with solutions which ought to make them straightforward to go through on your own.
There's also these Type/Category/Proof Theory Foundations videos (with Robert Harper as well): https://www.youtube.com/playlist?list=PL8Ky8lYL8-Oh7awp0sqa8...
I found these by doing some Googling and evaluating various forums/Stack Exchange posts; if anyone has any better suggestions I would love to hear them. (I haven't done SICP in depth and now, of course, I'm considering putting this plan on hold and doing SICP instead...)
I haven't found anything like SICP (thus my question), but I feel compelled to mention two great practical repos I discovered yesterday thanks to HN, both of which are teaching me a lot about practical type systems:
1. https://github.com/tomprimozic/type-systems (great practical intro to Hindley-Milner and variations)
2. https://github.com/typeclassy/plzoo (collection of mini languages implemented in OCaml, many of which feature different type systems)
Edit: Can't reply to jcurbo yet, but I'd be really interested in that Haskell link if you can remember it.
#!/bin/sh
mit-scheme < $@
Something on the order of 1 or 2 weeks in length, super compressed that gives working devs a chance to learn something new or explore something outside of their normal job. I'd love to do something like this, particularly in an exotic location, but against a set amount of time that doesn't require me to quit my job.
We've adjusted the format of the current Hacker Retreat to accommodate people working (remotely, on their startup, etc) - 20% of your time is committed to learning, the rest of the time is up to you. The time-span is over 2 months minimum. We're currently taking applications for the Batch-02 starting in May/June.
Super-compressed, 1-2 week retreats are something we've thought about, especially for advanced topics like data science and functional programming...may do it later, but not this summer.
I love the hack camp idea and chance to fully dive into something with like minded people, it just needs to fit into something I can spend my vacation days on.
Or would it be pointless to read through the book without a REPL/command line next to it?