Curated Computer Science Curriculum
How to Teach Yourself Computer Science: A Self Taught B.S. level CS Curriculum
##Introduction There are tons of free online resources that will help you "Learn Programming Language X," but it's difficult to find courses that will give you a deeper understanding of computer science (CS) like what's taught in a bachelor's level CS program. There is a lot more to CS than what you get from learning languages or going to a webdev bootcamp, so this is an attempt to create self taught curriculum based on the most important courses you'd learn in a typical BS in CS program.
Below you'll find a compilation of resources for teaching yourself the fundamentals of computer science. The categories are based largely off of the undergraduate pre-requisites for a Master's in Computer Science, with a few extra items based on what seems to be important to the professional CS community. The content was found all over the place, but the wonderful folks at /r/learnprogramming and /r/cscareerquestions have been especially helpful.
The curriculum is weighted towards interactive courses, followed by static courses with materials and sample exercises, followed by full texts. I've tried to avoid lists of YouTube videos and the like because it's harder to retain information from lectures. These are mostly free resources; however, I've included some books that are too useful not to mention.
Math:
Calculus, Statistics, Probability. Computer Science is a branch of mathematics after all.
- Khan Academy - Tons of resources here, but the math courses in particular are convenient and accessible. Select the math you want to know (Probability and Statistics, and Calculus) and Khan Academy will test you and determine what you need to learn to get there.
Programming Fundamentals:
The basic concepts of computer science: object-oriented programming, control structures, abstraction etc.
- Harvard University's CS50x: Introduction to Computer Science - Probably the most well supported MOOC ever. David Malan is a fantastic teacher, and the class is elegantly put together with lots of videos, examples, and automatically graded assignments. Uses C++.
Optional:
- Automate the Boring Stuff by Al Sweigart - You are going to need to be familiar with Python, this course will introduce you to Python and teach you basic automation. Uses Python.
Miscellaneous Skills:
You don't have to master these skills, but a little knowledge will go a long way. ###GitHub: Git is a version control system for managing software development. Learn how to use git and maintain an active portfolio of your own projects and contributions to other projects on GitHub. Collaborating on open-source software is a great way to learn the invaluable skills of working with other people and writing readable code.
-
Atlassian's Git Tutorials - Excellent intro tutorials on everything you need to get started with git.
-
Git Immersion - More advanced interactive git tutorials.
-
GitHub Guides - Guides for using the various features of GitHub.
###Touch Typing: Programming requires a lot of typing. A small investment in typing skills will save tons of time down the road.
- Keybr.com - This program offers the best combination of simplicity and effectiveness; it charts your progress and adjusts its difficulty accordingly.
###Programming Languages: You should be learning the fundamentals of programming through the other courses here, but sometimes you may need to pick up the syntax of a particular language.
-
codecademy - Quick, basic lessons in a number of popular languages and systems.
-
Michael Lee's Curated Programming Resources - A bunch of material for a bunch of languages.
###Stack Exchange An incredibly useful network of Q&A sites for getting help, it's like Yahoo Answers for people who know what they are talking about. The site is engineered to be as helpful as possible, but it may take a little getting used to. Stack Overflow is dedicated to programming questions.
-
Meta Stack Exchange FAQ - Explains the stack exchange system and how to use it successfully.
-
Stack Overflow's Help Center - Stack Overflow is for programming questions, the help center will be your guide. Take the tour if you've never used it before.
Discrete Structures:
"Mathematical structures that are fundamentally discrete rather than continuous." Includes logic, set theory, number theory, induction and recursion, etc.
-
How to Prove It by Daniel J. Velleman (book) - It's not about discrete math per se, but it does a great job of explaining the techniques behind mathematical proofs which will help you understand discrete math. The old edition was $15.
-
MIT OpenCourseware: Mathematics for Computer Science - Elementary discrete mathematics course with lecture videos and readings all available through the site.
Data Structures:
"Ways of organizing data in a computer so that it can be used efficiently."
- Saylor CS201: Elementary Data Structures - A collection of free resources that cover the basics of data structures.
- Geeks for Geeks: Data Structures - Series of articles and quizzes covering specific types of data structures.
- Reference: Wikipedia List of Data Structures
Learn the stuff above before starting these topics!
Algorithms:
One of the most important aspects of CS education. Algorithm design methods and arrays, stacks, queues, binary trees, etc.
-
Khan Academy's Intro to Algorithms - A great place to start.
-
MIT OpenCourseware: Introduction to Algorithms - Covers common algorithms, algorithmic paradigms, and data structures and has lecture videos, and problem sets with solutions. Requires a textbook (I found it for about $30 used). Requires familiarity with Python.
Optional:
- MIT OpenCourseware: Design and Analysis of Algorithms - More advanced coverage of algorithms. The course is very barebones, and has no videos. Requires the same textbook as the above class. Requires familiarity with Python.
- The Algorithm Design Manual by S. Skiena (book) - It's supposed to be a more approachable overview of algorithms. It's a bit pricey though ($80).
- Practice: Coding challenges to improve your understanding of algorithms - HackerRank, TopCoder, CodingBat, and /r/dailyprogrammer.
Databases:
Relational systems, data manipulation, query language (SQL), relational algebra, etc.
-
Stanford's Self-Paced Database Mini-Courses - Lecture videos and notes, transcripts, and exercises that provide an overview of databases.
-
SQL Bolt: SQL Tutorial - SQL is a standard language for accessing databases.
Non-Relational Databases (Optional): Get familiar with modern databases and NoSQL. Getting Started with MongoDB and M101P: MongoDB for Developers, Redis: Simple Twitter Clone Tutorial, optional: Seven Databases in Seven Weeks by J. Wilson (~$16 used).
Web Development:
Making websites.
- The Odin Project's: Web Development 101 - A full web development course in and of itself. There may be some repetition here, but it's self-paced so you can breeze through what you already know. Uses Ruby primarily.
Alternatively, FreeCodeCamp looks like a really interesting project in which you end up spending about 20 weeks building your portfolio by writing code for nonprofits. It's a huge course though (1600 hours), so it might be better to do it alone if you are more interested in web development.
Networks:
Packet-switching and circuit switching, TCP/IP protocal layers, reliable data transfer, congestion control, flow control, packet routing, etc.
-
Saylor CS402: Computer Communications and Networks - "A top-down approach to teach you the details about each layer and the relevant protocols used in computer networks." A course built of free resources curated from around the internet.
-
(Optional Intro Course) Microsoft Virtual Academy: Networking Fundamentals - "The building blocks of modern network design and function."
Computer Architecture:
Machine instructions, assembly language, system organization, etc.
- From Nand to Tetris - Build a modern computer system, starting from first principles.
Go Deeper (Optional):
-
University of Washington: Hardware/Software Interface - Examines key computational abstraction levels below modern high-level languages -- what really happens when software runs. Uses C.
-
Princeton University: Computer Architecture - Hardware and microprocessor design. May need to review: Digital logic, Microprocessors, Memory.
-
Computer Architecture: A Quantitative Approach by Hennessy and Patterson (book) - THE textbook on computer architecture. ~$60 used, you can get out of date versions for ~$10.
#Operating Systems:
Operating system management of processes, I/O, memory, and file systems. May be some overlap with Computer Architecture.
- Saylor CS401: Operating Systems - Detailed analysis of the major components of a modern operating system curated from free sources around the internet.
Optional:
-
Modern Operating Systems by A. Tennenbaum (book) - THE textbook on operating systems. The new edition is ~$100 used, the old edition is ~$10.
-
OSDev.org Tutorials - Learn by doing. Some tutorials for building simple OS functions. The rest of OSDev.org is a great reference in general.
#Internships/Real World Experience:
Complete your education by using it.
-
GitHub - As stated above, one of the based ways to get real world programming experience is to collaborate on open-source projects on GitHub. Working on GitHub has the added benefit of building you a public code portfolio.
-
LaunchCode - A network for self taught programmers that matches applicants with full-time paid apprenticeships. They recognize completion of Harvard's CS50 as a qualification for placement.
-
180 websites in 180 days - This is a brilliantly simple idea. Just build a different website featuring some new concept every day.
-
Dice and Stack Overflow Careers - Tech job boards.
-
FreeCodeCamp - Mentioned above, but it's worth highlighting here. This is a complete web development course (1600 hours - that's 40 full-time weeks) that culminates in 800 hours of writing code for nonprofits.
Don't forget local opportunities. There are meetups and hackathons and community groups everywhere. Connecting with real humans will open doors and help you avoid burnout.
#Advanced Topics The following subjects are important, but I did not include them above to avoid making this curriculum too overwhelming. Establish a solid foundation with the courses above before moving on to these: ###Compilers Understanding how compilers work will help you write better code and master new languages more quickly.
- Stanford: Compilers - "Learn how a program written in a high-level language designed for humans is systematically translated into a program written in low-level assembly more suited to machines."
###Cryptography: Techniques for secure communication in the presence of adversaries, an increasingly important topic.
- Stanford: Cryptography I - Videos and exercises on a broad overview of ciphers and key techniques.
###Debugging: Fix your broken programs.
- Udacity: Software Debugging - "How to debug programs systematically and how to automate the debugging process."
###Artificial Intelligence: The study and design of intelligent agents.
- Berkeley: Aritificial Intelligence - Basic ideas and techniques underlying the design of intelligent computer systems with a focus on behaviour from computation.