SICP video seems easier than the book - sicp

I find video lectures on SICP easier than the book. Is it really so? Have they got the same material? What is the optimal way of combining both?

The SICP videos are 20 lectures of ca. 60 minute lectures and covers the main essence of the book but far from all. This makes the videos easier to understand and in addition many gets things better by getting several senses stimulated at the same time which videos does. If you have your REPL ready and try stuff it's even better.
I usually link to the video lecture rather than the book when something coevered in the lectures are asked about. I love watching the wizards myself :)
I don't know how to combine them, but I've seen all the videos and started with the book afterwards to read and do the exercises, which I'm not yet finished with.

Related

Prerequisite for SICP

I have been programming in a "learn-by-doing" fashion for almost 2 years now and I consider myself fairly good however, I really wish to build a good foundation of Computer Science/Computer Engineering and most people recommend I start off with SICP. (Structure and Interpretation of Computer Programs)
I wished to know
Is this the best way to go about it?
I know how to code a matrix-multiplication in OpenMP and MPI and I know college level math, is this sufficient to read and appreciate SICP?
Instead of this, can I just spend all my time working on Project Euler instead?
A personal experience: Like you I am trying to learn programming by self-study and I started off with SICP. As I am a ancient historian and archaeologist, I have no background in maths, engineering or real computer science (just good knowlegde in stuff like LaTeX, HTML and CSS). My last lessons in math are now 15 years ago. Although I am working through SICP with a math book at my side the explanations given in SICP are really sufficient to understand the stuff. I really appreciate SICP, it is demanding, but great fun. I also would recommend to buy it as a book, I prefer that from reading on screen.
Sometimes you have to cope with some difficulties because language standards have changed (eg. Running SICP Pattern Matching Rule Based Substitution Code) or the authors assume existing functions which are just defined later in the book (eg. How do I get the functions put and get in SICP, Scheme, Exercise 2.78 and on). As a you always will find solutions or hints on the web this is nothing which should bother you.
If you know any amount of programming you'll likely be better off for it, but it's by no means a requirement when going through the SICP. I'm going through it right now (cover to cover style), and I'm up too section 2.3.3. The biggest road block for me has been how maths based some of the problems can be, as it's been a while since I did maths back in high school. For these problems I've resorted to googling an explanation of the problem and solution. Like programming, maths isn't a requirement either, obviously because I'm still making progress through the book, but I feel it could help at times.
The only requirement you'll honestly need, is a computer and a scheme implementation, I'd recommend MIT scheme or DrRacket.
TL;DR
The only requirement you'll need is a computer, and a scheme implementation, everything else can be learned as you go along.

What's the easiest way to explain What is Hadoop and Map/Reduce?

It's very easy to explain NoSQL from high level view - it is basically "key-value" storage. Of course with thousand minor and important things, but in general it's just key value storage.
What's the best way to explain Hadoop and Map/Reduce?
May be some "real world" example which can be easy to give an compare for even newbies? Thanks!
I recently found this great article describing Map Reduce :
I’ve been planning on writing about
the Google’s MapReduce algorithm for
some time but I couldn’t find a good
practical example. Then we had a
Northwest C++ Users Group presentation
by Steve Yegge and a followup
discussion and beers, and I had a
little epiphany. Steve was talking
about, among other things, the build
process. And that’s just a bunch of
algorithms that are perfect for
explaining MapReduce.
The code examples are in C++, but the content is really language agnostic.
Here's a great tutorial on map/reduce in general, explaining the background, basics and data flow. I'm finding it useful to explain Google's App Engine implementation as well.
http://developer.yahoo.com/hadoop/tutorial/module4.html

How can I learn higher-level programming-related math without much formal training? [closed]

Closed. This question needs to be more focused. It is not currently accepting answers.
Want to improve this question? Update the question so it focuses on one problem only by editing this post.
Closed 6 years ago.
Improve this question
I haven't taken any math classes above basic college calculus. However, in the course of my programming work, I've picked up a lot of math and comp sci from blogs and reading, and I genuinely believe I have a decent mathematical mind. I enjoy and have success doing Project Euler, for example.
I want to dive in and really start learning some cool math, particularly discrete mathematics, set theory, graph theory, number theory, combinatorics, category theory, lambda calculus, etc.
My impression so far is that I'm well equipped to take these on at a conceptual level, but I'm having a really hard time with the mathematical language and symbols. I just don't "speak the language" and though I'm trying to learn it, I'm the going is extremely slow. It can take me hours to work through even one formula or terminology heavy paragraph. And yeah, I can look up terms and definitions, but it's a terribly onerous process that very much obscures the theoretical simplicity of what I'm trying to learn.
I'm really afraid I'm going to have to back up to where I left off, get a mid-level math textbook, and invest some serious time in exercises to train myself in that way of thought. This sounds amazingly boring, though, so I wondered if anyone else has any ideas or experience with this.
If you don't want to attend a class, you still need to get what the class would have given you: time in the material and lots of practice.
So, grab that text book and start doing the practice problems. There really isn't any other way (unless you've figured out how osmosis can actually happen...).
There is no knowledge that can only be gained in a classroom.
Check out the MIT Courseware for Mathematics
Also their YouTube site
Project Euler is also a great way to think about math as it relates to programming
Take a class at your local community college. If you're like me you'd need the structure. There's something to be said for the pressure of being graded. I mean there's so much to learn that going solo is really impractical if you want to have more than just a passing nod-your-head-mm-hmm sort of understanding.
Sounds like you're in the same position I am. What I'm finding out about math education is that most of it is taught incorrectly. Whether a cause or result of this, I also find most math texts are written incorrectly. Exceptions are rare, but notable. For instance, anything written by Donald Knuth is a step in the right direction.
Here are a couple of articles that state the problem quite clearly:
A Gentle Introduction To Learning
Calculus
Developing Your Intuition For
Math
And here's an article on a simple study technique that aims at retaining knowledge:
Teaching linear algebra
Consider auditing classes in discrete mathematics and proofs at a local university. The discrete math class will teach you some really useful stuff (graph theory, combinatorics, etc.), and the proofs class will teach you more about the mathematical style of thinking and writing.
I'd agree with #John Kugelman, classes are the way to go to get it done properly but I'd add that if you don't want to take classes, the internet has many resources to help you, including recorded lectures which I find can be more approachable than books and papers.
I'd recommend checking out MIT Open Courseware. There's a Maths for Computer Science module there, and I'm enjoying working through Gilbert Strang's Linear Algebra course of video lectures.
Youtube and videolectures.com are also good resources for video lectures.
Finally, there's a free Maths for CS book at bookboon.
To this list I would now add The Haskel Road to Logic, Maths, and Programming, and Conceptual Mathematics: A First Introduction to Categories.
--- Nov 16 '09 answer for posterity--
Two books. Diestel's Graph Theory, and Knuth's Concrete Mathematics. Once you get the hang of those try CAGES.
Find a good mentor who is an expert in the field who is willing to spend time with you on a regular basis.
There is a sort of trick to learning dense material, like math and mathematical CS. Learning unfamiliar abstract stuff is hard, and the most effective way to do it is to familiarize yourself with it in stages. First, you need to skim it: don't worry if you don't understand everything in the first pass. Then take a break; after you have rested, go through it again in more depth. Lather, rinse, repeat; meditate, and eventually you may become enlightened.
I'm not sure exactly where I'd start, to become familiar with the language of mathematics; I just ended up reading through lots of papers until I got better at it. You might look for introductory textbooks on formal mathematical logic, since a lot of math (especially in language theory) is based off of that; if you learn to hack the formal stuff a bit, the everyday notation might look a bit easier.
You should probably look through books on topics you're personally interested in; the inherent interest should help get you over the hump. Also, make sure you find texts that are actually introductory; I have become wary of slim, undecorated hardbacks labeled Elementary Foobar Theory, which tend to be elementary only to postdocs with a PhD in Foobar.
A word of warning: do not start out with category theory -- it is the most boring math I have ever encountered! Due to its relevance to language design and type theory, I would like to know more about it, but so far I have not been able to deal...
For a nice, scattershot intro to bits of many kinds of CS-ish math, I recommend Godel, Escher, Bach by Hofstadter (if you haven't read it already, of course). It's not a formal math book, though, so it won't help you with the familiarity problem, but it is quite inspirational.
Mathematical notation is is akin to several computer languages:
concise
exacting
based on many idioms
a fair amount of local variations and conventions
As with a computer language, you don't need to "wash the whole elephant at once": take it one part a at time.
A tentative plan for you could be
identify areas of mathematics that are interesting or important to you. (seems you already have a bit of a sense for that, CS has helped you develop quite a culture for it.)
take (or merely audit) a few formal classes in this area. I agree with several answers in this post, an in-person course, at local college is preferable, but, maybe at first, or to be sure to get the most of a particular class, first self-teaching yourself in this area with MIT OCW, similar online resources and associated books is ok/fine.
if an area of math introduces too high of a pre-requisite in terms of fluency with notation or with some underlying concept or (most often mechanical computation and transformation techniques). No problem! Just backtrack a bit, learn these foundations (and just these foundations!) and move forward again.
Find a "guru", someone that has a broad mathematical culture and exposure, not necessarily a mathematician, physics folks are good too, indeed they can often articulate math in a more practical fashion. Use this guru to guide you, as he/she can show you how the big pieces fit together.
Note: There is little gain to be had of learning mathematical notation for its own sake. Rather it should be learned in context, just like say a C# idiom is better memorized when used and when associated with a specific task, rather than learned in vacuo. A related SO posting however provides several resources to decipher and learn mathematical notation
Project Euler takes problems out of context and drops them in for people to solve them. Project Euler cannot teach you anything effectively. I think you should forget about it, if it is popular it does not mean anything. You cannot study Mathematics through Project Euler as it contains only bits and pieces(and some pretty high level pieces) that you're supposed to know in order to solve the problems. Learning mathematics means to consider a subject and a read a book about it and solving exercices or reading solutions, that's how you learn math. If it so happens that through your reading you find something that is close to some project euler thing, your luck , but otherwise Project euler is a complete waste of time. I think the time is much better invested choosing a particular branch of mathematics and studying that. Let me explain why: I solved 3 pretty advanced Projec Euler problems and they were all making appeal to knowledge from Number theory which I happened to have because i studies some part of it. I do not think Iearned anything from Project Euler, it just happened that I already knew some number theory and solved the problems.
For example, if you find out you like number theory, take H. Davenport -> Hardy & Wright -> Kenneth & Rosen's , study those.
If you like Graph Theory take Reinhard Diestel's book which is freely available and study that(or check books.google.com and find whichever is more appropriate to your taste) but don't spread your attention in 999999 directions just because Project Euler has problems ranging from dynamic programming to advanced geometry or to advanced number theory, that is clearly the wrong way to go and it will not bring you closer to your goal.
This sounds amazingly boring
Well ... Mathematics is not boring when you find some problem that you are attached to, which you like and you'd like to find the solution to, and when you have the sufficient time to reflect on it while not behind a computer screen. Mathematics is done with pen and paper mostly(yes you can use computers .. but that's not really the point).
So, if you find a real-world problem, or some programming problem that would benefit from
you knowing some advanced maths, and you know what maths you have to study , it can be motivating to learn in that way.
If you feel you are not motivated it is hard to study properly.
There is also the question of what you actually mean when you say learn. Does the learning process stop after you solved the problems at the end of the chapter of a book ? Well you decide. You can consider you have finished learning that subject, or you can consider you have not finished and read more about it. There are entire books on just one equation and variations of it.
The amount of programming-related math that you can learn without formal training is limited, but it's more than enough. But maybe you can self-teach yourself.
It all boils down to your resources and motivation.
To know mathematics you have to do mathematics not programming(project euler).
For beginning to learn category theory I recommend David Spivak's Category Theory for the Sciences (AKA Category Theory for Scientists) because its relatively comprehensible due to many examples that enable understanding by analogy and which quickly builds a foundation for understanding more abstract concepts.
It requires the ability to reason logically and an intuitive notion of what is a set. It proceeds from sets and functions through basic category theory to adjoint functors, categories of functors, sheaves, monads and an introduction to operads. Two main threads throughout are modeling databases in terms of categories and describing categories with annotated diagrams called ologs. The bibliography provides references to more advanced and specialized topics including recent papers by Dr. Spivak.
An expected outcome from reading this book is the capability of understanding category theory texts and papers written for mathematicians such as Mac Lane's Category Theory for the Working Mathematician.
In PDF format it is available from http://math.mit.edu/~dspivak/teaching/sp13/ (the dynamic version is recommended since its the most recent). The open access HTML version is available from https://mitpress.mit.edu/books/category-theory-sciences (which is recommended since it includes additional content including answers to some exercises).

Structure and Interpretation of Computer Programs, what level of maths ability is required?

I regrettably haven't studied mathematics since I was 16 (GCSE level), I'm now a 27 year old C# developer.
Would it be a fruitless exercise trying to work through Structure and Interpretation of Computer Programs (SICP)?
What kind of mathematics standard is expected of the reader?
Having worked through all of SICP, I can tell you with confidence that you don't need a lot of math background to understand it. SICP is (used to be?) a first or second semester course in MIT, for students with practically no college/university level math. Whenever it discusses mathematical topics, it provides sufficient background for any intelligent reader to understand.
From the little you tell about yourself, it's great time to work through SICP. Reading the book and solving (at least some of) the exercises, and playing with the code of the projects, can teach you a lot about programming. Don't worry about math - you'll handle it without any problems. What's really needed is a true, deep curiosity about programming, and some patience.
It's never too late to start SICP. And it doesn't really require any higher maths at all, except perhaps in the signal processing with infinite streams parts. That can be skipped without losing too much though.
The most important thing while reading SICP is solving the problems, IMO. Some of the tougher ones can be mind-expanding and force you to really understand the topic. If you are confident about some solution you can skip it though. And the solutions can be found at - http://eli.thegreenplace.net/category/programming/lisp/sicp/
The danger in reading SICP is that after completing it, you will not like using any programming language other than Scheme. :)
I had a ganders at this book. My maths knowledge is not great ... but there is a key:
For understanding things like this, providing you have a creative mind and a good grasp of the abstract nature of structures and mathematical principles you should be fine. My mental arithmatic is pretty poor by anyones standards, but I love reading about discrete mathematics because of it's abstract nature.
I wouldn't consider myself a very good mathematician in the numeric sense, but as a software developer I like to think I have a mathematics (or mechanical) mind.
I wouldn't worry too much about your numeric strength but more about the nature of mathematics and the personality of the concepts underpinning computer science. If you have a good programming mind, maybe try and enhance that with combinatorics/discrete/concrete mathematics (which, besides counting theory, in many cases avoids dry numbers).
I found my love for things like set-theory studying compilers, and I wouldn't want to sit my maths A-level without alot of cramming!
Give it a go, what have you got to lose?
(im 22 and in a similar situation to you)
Good luck
PS: I also found the video lectures interesting. You can torrent them from
http://groups.csail.mit.edu/mac/classes/6.001/abelson-sussman-lectures/
It definitely wouldn't be a fruitless exercise, it's an excellent book. On the other hand, it would be kind of tough going, as they do expect you to have some mathematical sophistication, if not tons of advanced math.
You might find How to Design Programs, by Felleisen et al, a bit of an easier start while giving you much the same approach, using Scheme and all.
From what I can remember from this book, it talks about some matrix calculations, which might be hard to understand at first. But it is just list of lists, or array of arrays... so you will need to deal with that sooner or later in programming.
If there was any difficult math, I think you can skip it. This book was (and probably still is) used in Berkeley's first year computer science class (many students take it in the first semester), without any need of understanding calculus at all, so I think general understanding of math is good enough to understand the book.
The book talks about a function being a black box... and after reading the book, I think it helps a person's understanding of math in general as well.
The Numerical Programming section might require some higher math, but you should be able to digest the rest of the book with high-school math.

Where is a good place to brush up on some math?

Math skills are becoming more and more essential, and I wonder where is a good place to brush up on some basics before moving on to some more CompSci specific stuff?
A site with lots of video's as well as practice exercises would be a double win but I can't seem to find one.
It depends on your math level. You should start by revising what you should know till that moment and then go further to algorithm mathmatics, geometry (transforms and etc), statistics and more.
There are tons of places on the internet were you can learn:
http://www.math.cornell.edu/Courses/courses.html
http://ocw.mit.edu/OcwWeb/web/courses/courses/index.htm
http://mathworld.wolfram.com/
and the list is open.
I recommend Project Euler if you want to train number theory and discrete maths. Lots of fun exercises, though you need to know a bit of programming.
Steve Yegge had a good blog post Math for programmers
Quoting some of it:
"But a few things I've learned recently might surprise you:
Math is a lot easier to pick up after you know how to program. In fact, if you're a halfway decent programmer, you'll find it's almost a snap.
They teach math all wrong in school. Way, WAY wrong. If you teach yourself math the right way, you'll learn faster, remember it longer, and it'll be much more valuable to you as a programmer.
Knowing even a little of the right kinds of math can enable you do write some pretty interesting programs that would otherwise be too hard. In other words, math is something you can pick up a little at a time, whenever you have free time.
Nobody knows all of math, not even the best mathematicians. The field is constantly expanding, as people invent new formalisms to solve their own problems. And with any given math problem, just like in programming, there's more than one way to do it. You can pick the one you like best.
Math is... ummm, please don't tell anyone I said this; I'll never get invited to another party as long as I live. But math, well... I'd better whisper this, so listen up: (it's actually kinda fun.)"
I will be boring and recommend actually taking university courses in math.
Without lectures and lessons with an assistant I know I would never be able to learn as much as I have. I just need some kind of motivation, since higher math is really hard.
That is, if you are looking for quite advanced stuff and actually want to get a deep understanding and don't want to crunch numbers. Crunching numbers is why we have MATLAB ;)
It would be good to know what level of math you have, and what you want to do with it. But I guess calculus, linear algebra and discrete math are the most useful courses to take.
I suggest books with good tutorials throughout if you're unable to partake in a maths course. For computer science-related maths Don Knuth's Concrete Mathematics is meant to be very good.
Obviously nothing can replace a good teacher, but good tutorials can come pretty damn close. You really get to learn the subject in the tutorials I think.
Get some videos from www.aduni.org
Math courses
It's a couple of years since this question has been asked, but there are a number of new sites and resources available now:
Khan Academy was originally intended for schoolkids, but it has since expanded to include material that would not be out of place in first-year university courses. It serves as a great way to review and fix fundamentals. It has videos and practice exercises, and keeps track of your progress.
EdX is an evolution of initiatives like MIT Open Courseware. It's now an alliance of universities like MIT, Berkeley and Stanford that offer free online university level courses, with video instruction and learning materials. My only complaint is that some of their courses have prerequisites (like single-variable calculus) that you need to pick up elsewhere, like Coursera, or the original MIT OpenCourseWare site.
Coursera offers more courses than EdX, and many of them are more basic, covering topics like pre-algebra and pre-calculus. The learning interface is not quite as cool as EdX's (which offers a scrollable captioning interface alongside most of it's videos), but the broader range of topics and courses covering fundamentals offers learning you just won't find on EdX.
A lot of the universities will actually publish their lecture materials online. So all you really need to do is find a suitable subject and then read the lecture materials and do the associated work. If you were really sneaky you could probably also go to the tutorials to get help :P
BetterExplained.com has some great math lectures. Its not video lectures but the author gives easy-to-understand explanations on math concepts.
Don't forget that iTunes now has available a load of maths lectures (and other subjects) from various mainstream universities - and all for free.
Since you want to brush up your math
I would suggest you to do a G search on UCCS math online
Or follow this link , and after registering yourself free you can browse the archives
I must say that It's common that you will find people recommending course X .
But rarely will you find people completing their recommended course ..
SO IN the case of number theory you must go for the latest course , the last offering has not high quality video ..
Also for Discrete Math ->There are no lecture notes on this site
So you have to figure out how to establish correspondence two online course (6.042 has good P sets and Notes) And The above Math course for Discrete Math .
I would discourage you to use YouTube (x minutes ) tutorials , Because most of them cover Math like History ..
A good course can be found by G searching Harvard OlI--
It has probability (Non Continuous) - There are P sets without solutions ..

Resources