Pursuing Independent Computer Science Learning
by Joey Kyle Stickels, Hamline University
This blog post is intended to be used as a resource for anyone interested in learning Computer Science independently. There are many resources available, but this post offers a clear starting point to begin a learning journey, with an attempt to offer resources that may appeal to several different learning styles. The following structure provides an outline of information included in this post:
Overview of Computer Science Independent Learning
General Computer Science Resources
Suggested Computer Science Learning Plan
Beginning Programming
Introduction to Computer Science
Discrete Mathematics Resources
Mathematics Resources
Special Topics in Computer Science
Projects for Computer Science Learning
Approach - How might you approach learning Computer Science (CS) independently? What are some good methods for learning CS in general? (Practice!)
Learning Styles - Different learning styles require different approaches. What works for me personally is not necessarily the right answer - there isn't one right answer! This resource will provide a number of different types of learning tools which may fit differing learning styles in different ways. If you don’t quite know how you learn, that’s okay! Just try something out, and if that doesn’t seem to click for you, approach the same topic in a different way.
Learning isn’t rigid, but some information may be sequential - You can use this as a tool to guide you in your learning, and you don’t need to cover every topic or follow the exact sequence to start learning CS. It is important, however, to pay attention to mentions of prerequisites, because some resources will require more understanding of mathematical concepts or CS concepts than others.
Computer science is programming language agnostic - You can use whatever programming language you want to learn most computer science concepts. Throughout your journey, you might find yourself picking up many more languages than you thought were possible! Once you really start to get a handle on how programming works, most languages operate very similarly, with small changes in syntax and behavior between them.
Websites with some free courses
Coursera (Most courses are free if you are okay with not receiving a certification and doing assignments on your own without feedback.)
edX
Websites that can be used to practice programming
Beginning Programming
Prerequisites: Algebra
Concepts
Parts of a program
Variables
Objects and Types
Operators
Control
Algorithms
Data Structures and Functions
Open Textbooks
C
Programming in C by Kishori Mundargi, Myriam Grandchamp, Saraswathi Kaja, Sourav Chandra, Oscar Serrano
C++
Think C++ by Allen B. Downy
Programming Fundamentals - A Modular Structured Approach using C++ by Kenneth Leroy Busbee
C#/.NET
C# Programming - Wikibooks
Java
Think Java: How To Think Like a Computer Scientist 2e by Allen B. Downey & Chris Mayfield
Introduction to Programming Using Java 8e by David J. Eck
Introduction to Programming in Java by Robert Sedgewick and Kevin Wayne
Javascript
Eloquent Javascript: A Modern Introduction to Programming by Marijn Haverbeke
Python
A Byte of Python by Swaroop C H
How to Think Like a Computer Scientist: Learning with Python by Allen Downey, Jeffrey Elkner and Chris Meyers
Non-Programmer’s Tutorial for Python 3 - Wikibooks
Other
Think Raku: How to Think Like a Computer Scientist by Laurent Rosenfeld with Allen Downey
Open Courses
Introduction to Computer Science and Programming - MIT OpenCourseWare
Introduction to Computer Science and Programming in Python - MIT OpenCourseWare
Effective Programming in C and C++ - MIT OpenCourseWare
Introduction to Computer Science
Concepts
Abstraction
Data and Information
Algorithms
Formal Languages
Computability
Universality
Intractability
Textbooks
Java, Java, Java: Object Oriented Problem Solving, 3/E by Ralph Morelli and Ralph Walde
Foundations of Computation by Carol Critchlow and David Eck
Foundations of Computer Science by Al Aho and Jeffery Ullman
Philosophy of Computer Science by William J. Rapaport
Computer Science Principles by Seth D. Bergmann
Programming from the Ground Up by Jonathan Bartlett
Computer Science: An Interdisciplinary Approach by Robert Sedgewick & Kevin Wayne
Video Content
Harvard’s CS50 Lectures 2020 - YouTube Playlist
Discrete Mathematics
Ties directly into Algorithms and Data Structures
Concepts
Proofs
Sets
Functions
Relations
Graphs
Modular Arithmetic
Counting
Discrete Probability
Textbooks
Applied Discrete Structures by Al Doerr and Ken Levasseur
Open Courses
Mathematics for Computer Science - MIT OpenCourseWare
Video Content
MIT’s Mathematics for Computer Science, Fall 2010 - YouTube Playlist
Algorithms and Data Structures
Concepts
Comparing Algorithms
Sorting Algorithms
Searching Algorithms
Graphs
Trees
Strings
Lists
Hash Tables
Textbooks
Algorithms 4e by Robert Sedgewick and Kevin Wayne
Open Data Structures: An Introduction by Pat Morin
Algorithms and Data Structures With Applications to Graphics and Geometry by Jurg Nievergelt and Klaus Hinrichs
Think Data Structures by Allen B. Downey
Courses
Introduction to Algorithms - MIT OpenCourseWare
These math resources can be used for background knowledge when learning CS concepts and skills.
Open Textbook Resources
Algebra
Pre-Algebra
Elementary Algebra
Intermediate Algebra
College Algebra
Algebra and Trigonometry
College Algebra with Corequisite Support
Statistics
High School Statistics
Introductory Statistics
Think Stats: Exploratory Data Analysis in Python by Allen B. Downey
Trigonometry
Trigonometry by Ted Sundstrom and Steven Schlicker
Calculus
Calculus Volume 1
Discrete Mathematics
Discrete Mathematics: An Open Introduction by Oscar Levin
Combinatorics
Combinatorics by Joy Morris
Linear Algebra
Linear Algebra with Applications by W. Keith Nicholson
Complexity Science
Think Complexity by Allen B. Downey
Introduction to the Modeling and Analysis of Complex Systems by Hiroki Sayama
Game Development
Harvard’s CS50's Introduction to Game Development 2018 - YouTube Playlist
Harvard’s CS50 2019 - Games Track - YouTube Playlist
Making Games with Python and Pygame by Albert Sweigart
MIT OpenCourseWare - Creating Video Games
Web Development
The Missing Link: An Introduction to Web Development and Programming by Micheal Mendez
Programming Languages
Programming Languages: Applications and Interpretation by Shriram Krishnamurthi
Synchronization
The Little Book of Semaphores by Allen B. Downey
Software Development
MIT OpenCourseWare - Software Construction
MIT OpenCourseWare - Performance Engineering of Software Systems
MIT OpenCourseWare - Computer System Engineering
Often, especially with CS, it is most effective to learn through practical application once we understand the basic concepts we’re trying to apply. One of the best ways to do this is by starting (and completing) projects. Learning through projects allows you to practice design and planning, goal setting, and breaking up a project into digestible pieces.
Remember to keep things simple, especially to start, because finishing even a small project is still a huge undertaking.
Be careful of feature creep - Try to keep closely to the original plan of your project and complete it, before adding extra features.
Short Programs
UPC Validator: Intermediate - Create a function that takes in a Universal Product Code (UPC) code and checks if it is valid. You can search online to find how you can verify UPC codes.
Merge Sort - Create a function implementing the merge sort algorithm.
Bubble Sort - Create a function implementing the bubble sort algorithm.
Libraries
Graphs: Intermediate - Create a library that allows you to create and manipulate graphs (or networks). Try implementing Dijkstra’s Algorithm to find the shortest path through a graph using its edges.
Applications
Calculator - Create an application that can do addition, subtraction, multiplication and division.
Text Editor - Create an application that can open, edit and save text documents.
Address Book: Intermediate - Create an application to keep track of contact information - names, emails, phone numbers
Product Inventory: Intermediate - Create an application that a business could use to keep track of their product inventory. Brainstorm what features would be useful for
Web browser: Hard - Create an application that can access the internet, interpret HTML and CSS, and navigate through web pages.
Games
Pong Clone: Intermediate - Create your own version of the game pong. Break down the elements of the game.
Read about how Joey began to learn about computer science and how his interest grew in his My STEM Path: Computer Science post.