Take the 2-minute tour ×

I'm a self taught iOS (iPhone/iPad) programmer but didn't study CS in school. Are there any books or site I can study that will teach more about CS, in general. For example some common practices and how different languages work together etc.

I don't need full details but simply just an overview of common CS stuff. I know this is a broad question but any info would be good.

share|improve this question
**Do It Yourself Computer Science**<br> diycomputerscience.com **MIT Open Courseware**<br> ocw.mit.edu/courses/electrical-engineering-and-computer-science –  skizeey Sep 24 '11 at 4:41
This is actually an epically important question. –  skizeey Sep 24 '11 at 4:41
add comment

closed as too broad by MichaelT, Bart van Ingen Schenau, GlenH7, gnat, Kilian Foth Jul 28 '13 at 12:47


4 Answers

If you are looking for a good, theoretical base of knowledge, check out the MIT Open CourseWare site. The site has a great collection of content, including videos, of computer science / engineering classes. I would start with the great "Structure and Interpretation of Computer Prorgams", and alo check out the "Intro to Algorithms" class.


share|improve this answer
I agree. Their Algorithm Analysis course is very good. –  FossilizedCarlos Sep 25 '11 at 2:18
add comment

The correct answer depends on what you want to do with CS.

If you just want to continue programming as a hobby or side project, you may benefit most from simply learning a new programming language. Though programming languages change with time, learning one that is wildly different from what you are used to is a great way to familiarize yourself with common practices, different design philosophies, and the advantages and disadvantages of different languages and libraries. Tutorials on how to start developing in a given language are easy to find on the internet.

The benefits are that you don't need a heavy math or technical background, can get started immediately, and while you get familiarized with a new way of thinking, you gain an actively applicable skill set. The downside is that without a deep understanding of CS fundamentals, you may not be able to take full advantage of all the features most languages have to offer.

You can also read various technical articles on the lesser-known features of languages--IBM provides Java tutorials for even advanced Java programmers, for example:


That said, the main advantage (and, as some might argue, disadvantage) of a formal CS education is usually the theoretical and technical element--this includes formal theory like algorithms and complexity theory, as well as low-level study of computer architectures, operating systems, and microprocessors. You certainly don't need these to be a competent programmer, but being familiar with them will definitely make you a more powerful programmer.

If you have a strong math background, you can jump right into algorithms with:


but if you don't want to go into the books immediately, you can always get a piece of higher CS education with free lectures, provided by many renowned universities:


In either case, it really depends on what you want to do in the future. Do you see yourself getting a job in software development? Programming iPhone apps for fun on the side? Studying computational theory to sharpen your mind? It's up to you.

share|improve this answer
add comment

Computer Science is not necessarily about common practices or how languages work together. It's more about the science of computing. That said, different programs in different universities and different countries may vary quite a lot from the purely theoretical to more engineering oriented.

I would recommend David Harel's book "Algorithmics: The Spirit of Computing". Also there is Knuth's "The Art of Computer Programming". There are few good algorithm and data structures books that are part of most core CS programs, e.g. "Introduction to Algorithms".

Other topics CS programs may cover are (in random order): computer architecture, operating systems, networks, compilers, calculus, linear algebra, group theory, complexity theory, statistics, combinatorics, discrete mathematics, computer graphics, numerical analysis, coding theory, there are usually some programming language specific courses, graph theory, logic, computational geometry... The list goes on (and may be slightly out of date). You can probably find relatively easily online what the curriculum is for different schools.

I also second Ed Schembor recommendation for MIT OCW. There are also many other universities (e.g. Stanford) that have many online courses.

share|improve this answer
That's a good list of topics, but I wouldn't recommend TAOCP for anyone who's looking for an overview of anything. They're more for someone who already knows what (say) a b-tree is, and wants to know exactly how it works. –  TMN Sep 24 '11 at 14:29
@TMN: It was one of the first CS books I've read when I was in high school. IIRC Knuth introduces everything from the ground up. I didn't understand everything in my first read of it (or second, or third :-) ) but the knowledge is in there, you just need to spend a lot of time on it. You still get a lot from reading it. –  Guy Sirton Sep 24 '11 at 16:28
add comment

Consider whether you want to learn more about Computer Science or Software Engineering. There is some overlap. Do you want to learn how to build more reliable systems in a more reliable manner (Software Engineering), or do you want to learn more about the science of computing.

If you have access to a nearby university, and a flexible schedule, consider enrolling and taking classes. The online lecture notes are nice, but in my opinion they are more useful for some who has already understands most of the material already and who only needs to fill in gaps, or refresh knowledge in areas that they have not used recently.

share|improve this answer
add comment
