Repository: ossu/computer-science Branch: master Commit: b65f71ba817c Files: 29 Total size: 144.0 KB Directory structure: gitextract_xdzxbgza/ ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ └── request-for-comment-template.md │ └── workflows/ │ └── delete-empty-issues.yml ├── .gitignore ├── CHANGELOG.md ├── CNAME ├── CONTRIBUTING.md ├── CURRICULAR_GUIDELINES.md ├── FAQ.md ├── HELP.md ├── LICENSE ├── README.md ├── _config.yml ├── _includes/ │ ├── custom-head.html │ ├── footer.html │ └── nav-items.html ├── _layouts/ │ └── page.html ├── coursepages/ │ ├── intro-cs/ │ │ └── README.md │ ├── intro-programming/ │ │ └── README.md │ ├── ostep/ │ │ ├── Project-1B-initial-xv6.md │ │ ├── Project-2A-processes-shell.md │ │ ├── README.md │ │ ├── Reading-order.md │ │ ├── Scheduling-xv6-lottery.md │ │ └── vm-xv6-intro.md │ └── spd/ │ └── README.md └── extras/ ├── courses.md ├── other_curricula.md ├── puzzles-practice-plods.md └── readings.md ================================================ FILE CONTENTS ================================================ ================================================ FILE: .github/ISSUE_TEMPLATE/request-for-comment-template.md ================================================ --- name: Request for Comment Template about: Template for creating an RFC to modify the curriculum title: 'RFC: ' labels: '' assignees: '' --- **Problem:** Give a 1 sentence description of a problem with the current OSSU Curriculum. Successful critiques of the curriculum will point out ways that OSSU is failing to uphold [our curricular guidelines](https://github.com/ossu/computer-science/blob/master/CURRICULAR_GUIDELINES.md). Examples are: * OSSU lists course X as required when the course's topics are elective in our curricular guidelines. * OSSU does not having a course to cover required topic X from our curricular guidelines. * OSSU lists courses X, Y and Z that cover the same topics when fewer courses could suffice. * OSSU recommends course X to teach a topic, but there exists a higher quality course that covers the same material. **Duration:** This should most often be 1 month from the date of posting. **Background:** Give an in depth description of the problem. Describe a solution to the problem. Describe the advantages and disadvantages of this solution. This section should be a few paragraphs. **Proposal:** Give a bullet point list of changes that are being proposed. These can link to a Pull Request. **Alternatives:** Give a bullet point list of alternative ways to address the problem. ================================================ FILE: .github/workflows/delete-empty-issues.yml ================================================ name: Delete empty issues on: issues: types: - opened jobs: label_issues: runs-on: ubuntu-latest permissions: issues: write if: github.event.issue.body == '' || contains(github.event.issue.body, 'Give a 1 sentence description of a problem with the current OSSU Curriculum. Successful critiques of the curriculum will point out ways that OSSU is failing to uphold') steps: - name: Create comment uses: actions-cool/issues-helper@v3 with: actions: 'create-comment' token: ${{ secrets.GITHUB_TOKEN }} issue-number: ${{ github.event.issue.number }} body: | Hello @${{ github.event.issue.user.login }}. It looks like you've opened an empty issue or one without a unique problem description. Please understand that this is a popular project, useful to many learners, and empty issues distract maintainers that are trying to help others. If you would like practice with issues, you can follow github documentation to create your own repo: https://docs.github.com/en/repositories/creating-and-managing-repositories/creating-a-new-repository And then in that repo practice creating and editing issues: https://docs.github.com/en/issues/tracking-your-work-with-issues/configuring-issues/quickstart We look forward to your future contributions to OSSU, when you are contributing to improve computer science education for learners all over the world! - name: Close issue uses: actions-cool/issues-helper@v3 with: actions: 'close-issue' token: ${{ secrets.GITHUB_TOKEN }} issue-number: ${{ github.event.issue.number }} ================================================ FILE: .gitignore ================================================ .idea *.swp *.swo .direnv/ .envrc ================================================ FILE: CHANGELOG.md ================================================ # Change Log **Note**: The curriculum is currently undergoing review for v9. This consists largely of checking our recommendations against our [curricular guidelines](CURRICULAR_GUIDELINES.md), adding missing topics and cutting redundant or out of scope courses. As Requests for Comment in this effort are completed, changes are made immediately to the curriculum. When the overall review is complete we will notate the version bump to v9. All notable changes to this project will be documented in this file. This project adheres *in spirit* to [Semantic Versioning](http://semver.org/): - "MAJOR" updates correspond to changing the topics studied within a subject - "MINOR" updates correspond to changing courses without changing the topics - "PATCH" updates correspond to aesthetic and non-essential additions/removals or changing order of classes for better progression ## [8.0.0] 2017-11-01 ### Added - extras/readings: "The System Design Primer" - extras/readings: "Category Theory for Programmers: The Preface" - extras/readings: "Programming Languages: Application and Interpretation" - extras/readings: "Programming and Programming Languages" - CONTRIBUTING: "Learning Git" section to the contributor guidelines page - Core Math: Added "Essence of Linear Algebra" as pre-requisite to "Linear Algebra: Foundations to Frontiers" ### Updated - Moved "Introduction to Mathematical Thinking" to extras/courses - Moved "Hack the Kernel" (ops-class) from Advanced Systems to Core Systems - Core Systems: "Operating Systems: Three Easy Pieces" is no longer required, but is recommended as companion text to "Hack the Kernel" - Core Theory: Replaced Coursera with Lagunita as the host for Stanford Algorithms, since Coursera uses dark patterns to trick users into paying ## [7.2.2] 2017-07-02 ### Added - "Haskell Programming from First Principles" book as a paid alternative to learn Haskell - "Think Python" to extras/readings - FAQ entries and links under relevant courses - "Category Theory: A Gentle Introduction" to extras/readings ## [7.2.1] 2017-05-14 ### Updated - Networking course should take 8 weeks to complete - Fixed spelling error ### Added - Introduction to Haskell course to [extras/courses](extras/courses.md) ## [7.2.0] 2017-04-28 ### Added - Software Testing course - Link to Stanford Lagunita's Algorithms: Design and Analysis - Added link to the section on parametric equations and polar coordinates from MIT's Single Variable Calculus course in order to properly prepare students for Multivariable Calculus ## [7.1.2] 2017-04-22 ### Updated - Add link to Mega Project List in the introduction of the Projects section ## [7.1.1] 2017-04-11 ### Updated - Final touch to release ## [7.1.0] 2017-04-10 ### Updated - Reverted reformat of programming languages course ### Added - Reliable Distributed Algorithms courses - New Introduction to CS course ## [7.0.2] 2017-03-30 ### Updated - Moved optional online learning courses to extras/courses in a new section - Moved alternate computer architecture course to extras/courses ### Added - Scala specialization under Advanced applications ### Removed - Removed all but one choice for required readings to make the curriculum simpler ## [7.0.1] 2017-03-11 ### Updated - Fixed link to Bradfield's DIY computer science page ### Added - Note under Calculus One with links to errata and course progression recommendations - Optional courses under extras: - Strang's course on linear algebra - Berkeley's Structure and Interpretation of Computer Programs - Optional readings under extras: - Van Roy's advanced programming book - P&H's computer architecture book - Skiena's algorithms book - Strang's linear algebra book - Database Management Systems book - Tarr's book on creating your own Domain-specific language - Readings from various authors on distributed systems ## [7.0] 2017-03-09 Complete overhaul of program structure ### Updated - Clarified contributor guidelines and moved them to separated file - Switched from many subjects to just four subjects with many topics - Consolidated free-books.md and paid-books.md into readings.md - Consolidated free-courses.md and paid-courses.md into courses.md - Replace old "How to Code" with new "How to Code" (Software Development MicroMasters) - Replace Princeton Algorithms (moved to [alternative courses](#extras/courses.md)) with Stanford Algorithms ### Added - Indicate prerequisites for all courses - Requirements: subject/topic requirements and project requirements - Required readings on Haskell, Prolog, Operating Systems - Courses: Dan Grossman's Programming Languages - Courses: From Nand to Tetris - Elective course: Intro to Parallel Programming - Elective course: LAFF: Programming for Correctness - Elective course: Introduction to Mathematical Thinking - Elective courses: Electricity and Magnetism - Elective courses: MIT's Computation Structures - Elective course: Multivariable Calculus - Elective course: ops-class.org - Elective course: Automata Theory - Elective course: Introduction to Logic - Elective course: Computational Geometry - Elective course: Formal Concept Analysis - Elective course: Game Theory - Elective specializations: - Robotics - Data Mining - Big Data - Internet of Things - Cloud Computing - Full Stack Web Development - Data Science - Pro specializations: - Mastering Software Development in R - Artificial Intelligence Engineer - Machine Learning Engineer - Cybersecurity - Android Developer ### Removed - Removed many dead links and obsolete courses - Removed per-course project requirement - Course: Object-Oriented Programming in Java - Course: Functional Programming in Scala - Course: Computer Architecture (but left as a footnote) - Course: Intro to Theoretical Computer Science - Course: Software Processes and Agile Practices - Course: Operating Systems & System Programming - Course: Introduction to Cyber Security - Course: Parallel Computer Architecture and Programming - Course: UX Design for Mobile Developers ## [6.0] 2016-10-09 ### Updated - Put Calculus One before and together with Mathematics for Computer Science - Improve text in "Order of the classes" ### Added - Create public Trello board with the new curriculum version - Create the section "How to track and show your progress" in "How to use this guide" - Add PROJECTS.md file - Copy all sections of curriculum to PROJECTS.md ### Removed - Remove "Next Goals" section - Remove reference to OSSU web app ## [5.1.0] 2016-08-20 Update to latest version of Math for Computer Science: ### Updated - Section: **Math (Discrete Math)** - Mathematics for Computer Science ## [5.0.0] 2016-08-20 Due to removed course, we had the following updates: ### Removed - Section: **Natural Language Processing** - Natural Language Processing ### Added - Section: **Natural Language Processing** - Introduction to Natural Language Processing ## [4.1.0] 2016-08-05 Due to Coursera's platform changes, we had the following updates: ### Fixed - Section: **Big Data** - Introduction to Big Data ## [4.0.0] 2016-07-30 Due to Coursera's platform changes, we had the following updates: ### Removed - Section: **Theory** - Automata - Section: **Math (Linear Algebra)** - Coding the Matrix: Linear Algebra through Computer Science Applications - Section: **Parallel Computing** - Heterogeneous Parallel Programming - Section: **Natural Language Processing** - Natural Language Processing ### Fixed - Section: **Computer Networks** - Computer Networks - Section: **Compilers** - Compilers ### Added - Section: **Theory** - Intro to Theoretical Computer Science - Section: **Math (Linear Algebra)** - Linear Algebra - Foundations to Frontiers - Section: **Parallel Computing** - Parallel Computer Architecture and Programming - Section: **Natural Language Processing** - Natural Language Processing ## [3.0.0] 2016-05-04 ### Removed - Section: **Introduction to Computer Science**: - Introduction to Computer Science and Programming Using Python - From Nand to Tetris (Part 1) ### Added - Section: **Introduction to Computer Science**: - Introduction to Computer Science - CS50 ## [2.0.1] 2016-04-04 ### Fixed - Now students should enroll through our [web app](https://ossu.firebaseapp.com). ## [2.0.0] 2016-03-17 ### Fixed - Program Design section course's names and links ### Removed - **Introduction to Computer Science**: - Introduction to Computer Science - Introduction to Computational Thinking and Data Science - **Algorithms** - Analysis of Algorithms - **Programming Paradigms** - Principles of Reactive Programming - **Math (Calculus)** - Multivariable Calculus - **Software Architecture**: - Web Application Architectures - **Software Engineering**: - Agile Development Using Ruby on Rails - Basics - Agile Development Using Ruby on Rails - Advanced - Startup Engineering - **Computer Architecture**: - The Hardware/Software Interface - **Operating Systems**: - Operating System Engineering - **Computer Networks**: - Introduction to Computer Networking - **Cryptography**: - Applied Cryptography **ps**: These removed courses are now in the [extras](https://github.com/ossu/computer-science/tree/master/extras) section. ## [1.3.12] 2016-03-17 ### Added - How to collaborate: send new links to the extras section ## [1.3.11] 2016-03-06 ### Fixed - Nand to Tetris: change name and url - UC Berkeley Agile development: change name and url - Direct links to specializations ## [1.3.10] 2016-03-06 ### Fixed - Link from Systematic Program Design Part 2 course ## [1.3.9] 2015-11-09 ### Fixed - Link for the correct Natural Language Processing course ## [1.3.8] 2015-11-07 ### Added - Add "Project Suggestions" section with more references ## [1.3.7] 2015-11-01 ### Removed - Removed project.md file, moved to **help** repo ## [1.3.6] 2015-10-22 ### Added - Latest version of CS 162, Operating Systems and System Programming ## [1.2.6] 2015-10-19 ### Added - Badge/Link to the Awesome list ## [1.2.5] 2015-10-16 ### Fixed - Fix name of the section and add a hyperlink to it. ## [1.2.4] 2015-10-14 ### Removed - Removed citation about public commitment ## [1.2.3] 2015-10-12 ### Changed - Updated the prerequisite section for more clarity ## [1.2.2] 2015-10-12 ### Fixed - New link to issue intended for students' enrollment ## [1.2.1] 2015-10-11 ### Added - Article Git - the simple guide to the prerequisite section ##[1.1.1] 2015-10-11 ### Fixed - Fix typos - As MOOC is a "Massive Open Online Course" MOOC course is redundant - Elaborated on "real problem" - Fixed a few small grammatical and wording errors ## [1.1.0] 2015-10-08 ### Added - Motivation & Preparation section (optional resources) - Article: MIT Challenge - Course: Learning How to Learn ## [1.0.0] 2015-10-08 Release of the first **complete** version of the Computer Science curriculum ================================================ FILE: CNAME ================================================ cs.ossu.dev ================================================ FILE: CONTRIBUTING.md ================================================ # Changing the curriculum OSSU thrives because of the changes made by our many contributors. Read on for details on how to help every student that follows you. ## Non-substantive changes If you have non-substantive updates to make to the curriculum, such as a course's URL having been moved, spelling/syntax errors, etc., please send a [pull request](https://www.freecodecamp.org/news/how-to-make-your-first-pull-request-on-github-3/) to fix any mistakes that you have found. If you’ve never made a pull request before, that guide will walk you through the process. ## Substantive changes If you have specific and substantive criticisms of the curriculum, i.e. problems related to the progression/content of courses it would be appropriate to [open an issue](https://help.github.com/articles/creating-an-issue/). While it is acceptable to point out problems, all successful changes naturally require a plan for fixing the problem. OSSU’s curricular guidelines are [here](CURRICULAR_GUIDELINES.md). Successful critiques of the curriculum will point out ways that OSSU is failing to uphold these guidelines. Examples are: * OSSU lists a course as required when the course topics are elective in the curricular guide. * OSSU not having a course to cover required topics from the curricular guide. * OSSU lists multiple courses that cover the same topics when fewer courses could suffice. * OSSU recommends a course to teach a topic, but there exists a higher quality course that covers the same material. ## Other ways to contribute ### Responding to Issues Issues require more than just users to suggest them. Issues require active community members to read and respond to proposals. Even adding simple [emoji reactions](https://github.blog/2016-03-10-add-reactions-to-pull-requests-issues-and-comments/) can help the community. ### Engaging with other students Learning is enhanced by engaged peers. You can be that peer for someone new to OSSU. When you see a new person posting in Discord, ask them a question about themselves. When you see a cohort starting at _almost_ the right time, join in. Doing so will make OSSU a stronger program for everyone, including you. # Personal Customization If you want to customize the curriculum for yourself, you are encouraged to [fork this project](https://help.github.com/articles/fork-a-repo/)! ================================================ FILE: CURRICULAR_GUIDELINES.md ================================================ # Curricular Guidelines [Curriculum Guidelines for Undergraduate Programs in Computer Science](https://www.acm.org/binaries/content/assets/education/cs2013_web_final.pdf) Our curricular guidelines are from the 2013 report of the Association for Computing Machinery and the Institute of Electrical and Electronics Engineers. This report is the most recent in a series of such reports outlining the expectations of undergraduate degrees in Computer Science. The report outlines critical Knowledge Areas and topics within them. It drills down further to outline specific learning goals, going so far as to outline what concepts a student must be able to explain vs concepts a student must be able to demonstrate using in practice. The CS2023 is currently under development. Track its progress to release [here](https://csed.acm.org/). ## Organizations publishing: ### The Association for Computing Machinery The Association for Computing Machinery (ACM) is an international learned society for computing. It was founded in 1947, and is the world's largest scientific and educational computing society. The ACM is a non-profit professional membership group, with more than 100,000 members as of 2011. ### Institute of Electrical and Electronics Engineers The Institute of Electrical and Electronics Engineers (IEEE) is a professional association formed in 1963 from the amalgamation of the American Institute of Electrical Engineers and the Institute of Radio Engineers. As of 2018, it is the world's largest association of technical professionals with more than 423,000 members in over 160 countries around the world. Its objectives are the educational and technical advancement of electrical and electronic engineering, telecommunications, computer engineering and allied disciplines. ================================================ FILE: FAQ.md ================================================ # Frequently Asked Questions This page answers some questions that we frequently receive about the curriculum. If you have questions that aren't answered here, try asking through one of our [community channels](README.md#community). If it seems important enough or we get asked that question a lot, we will probably add it here. Alternatively, you could [contribute](CONTRIBUTING.md) an answer yourself. ## Contents - [Does OSSU offer a degree?](#does-ossu-offer-a-degree) - [How can I review the math prerequisites?](#how-can-i-review-the-math-prerequisites) - [What is a good course to learn a language (C++, Rust, Java, etc)?](#what-is-a-good-course-to-learn-a-particular-language) - [Why is the Firebase OSSU app different/broken?](#why-is-the-firebase-ossu-app-different-or-broken) - [In what order should I take the courses?](#in-what-order-should-i-take-the-courses) - [Does every resource in the main curriculum have to be free?](#does-every-resource-in-the-main-curriculum-have-to-be-free) - [Are Coursera courses free to access?](#are-coursera-courses-free-to-access) - [Is it necessary to purchase the Verified Upgrade for edX courses?](#is-it-necessary-to-purchase-the-verified-upgrade-for-edx-courses) - [What are the alt links?](#what-are-the-alt-links) - [Why doesn't the curriculum cover/ignore topic X?](#why-doesnt-the-curriculum-coverignore-topic-x) - [Why is the curriculum missing some pre-requisites?](#why-is-the-curriculum-missing-some-pre-requisites) - [Why require experience with a sizable project before the Software Engineering courses?](#why-require-experience-with-a-sizable-project-before-the-software-engineering-courses) - [How can I find a course on a particular subject?](#how-can-i-find-a-course-on-a-particular-subject) ## Questions ### Does OSSU offer a degree? No. OSSU creates guides to resources that will empower you to learn the curriculum of an undergraduate degree. Individuals who used to be involved in OSSU may be working with other organizations to offer degrees, but Open Source Society University is not involved in those efforts. ### How can I review the math prerequisites? See our [Pre-College Math](https://ossu.dev/precollege-math) curriculum for a list of resources to use for reviewing the math prerequisites. ### What is a good course to learn a particular language? OSSU focuses on finding the best courses to learn computer science topics, and isn’t focused on finding language-specific courses. If you are looking to learn a particular language or framework there are two great resources to check. 1. [Hackr.io](https://hackr.io/tutorials/) allows users to submit and upvote learning resources for topics such as Python or the Java Spring Framework. 2. Most languages have a community on Reddit. When you find the community’s page, check to see if there is a wiki or sidebar with resources. For example, see [/r/python](https://old.reddit.com/r/Python). Note that the sidebar content can be different depending on whether you use www.reddit.com or old.reddit.com. ### Why is the Firebase OSSU app different or broken? The OSSU curriculum and ecosystem have been collaboratively built by many individuals. The Firebase app was one such contribution. When it was written, it was with the intention of helping future OSSU students. Unfortunately, the app has not been updated in many years. It does not reflect updates to the curriculum, it contains links to courses that no longer exist, and it has known bugs that prevent students from logging in. It is our hope that the creators of the Firebase app can bring the app up to date. Until that time, the firebase app should be considered a deprecated product that is no longer supported. ### In what order should I take the courses? You have a few different options: - You can progress linearly from top to bottom of the page. - You can progress linearly through each individual section, but studying different sections in parallel. - You can design your own custom progression using the pre-requisites to guide you. We have designed the curriculum to work for any of the above three styles. ### Does every resource in the main curriculum have to be free? Yes, that is a core goal of OSSU. At the same time, we recognize that education is a resource that requires payment to instructors to make it sustainable in the long term. Therefore, we respect the business model of websites like edX, which make their materials free but with some paid add-ons, like official certificates or extra interaction with course instructors. So we only require that the *learning materials* of a resource be free to access, not that every possible add-on be free. It would be ideal if graded assignments were always free. In the event that free assessments are not available OSSU looks for alternate assessments to pair with a course. ### Are Coursera courses free to access? Short answer: No. Not anymore. In [July of 2025, Coursera removed audit access](https://www.classcentral.com/report/coursera-preview-mode-paywall/) for the vast majority of their courses, including all of the Coursera courses that OSSU included in its curriculum at the time. Unless something changes at Coursera, OSSU will no longer be recommending their courses. We are currently reviewing options for free resources that can replace the Coursera courses that are still in the curriculum. We ask that you help overcome this challenge by finding replacements and engaging with RFC discussions in the [Issues tab](https://github.com/ossu/computer-science/issues) where we are discussing alternatives. We may have more up-to-date recommendations in the [Discord channel](https://discord.gg/wuytwK5s9h) so please do check there as well. ### Is it necessary to purchase the Verified Upgrade for edX courses? If you just want to watch the videos, it is never necessary for any edX course on our curriculum. Note that a number of edX courses only allow students to audit a course for the estimated number of weeks it takes to complete. Students should not begin a course until they are prepared to focus and complete the course. ### What are the alt links? Sometimes a course is on multiple platforms that are reasonably similar in quality so we have an alt or two linked in case the main one isn't being offered at the time or you prefer the other one. Both are just as good, go with whichever you prefer or whichever is available when you want to take the course. ### Why doesn't the curriculum cover/ignore topic X? You can read more about our curricular guidelines and the qualifications of the guidelines' authors [here](CURRICULAR_GUIDELINES.md). If you find a topic that is required by our guidelines and is not included in the curriculum, we should make a change! Read more about [contributing to a change](CONTRIBUTING.md). ### Why is the curriculum missing some pre-requisites? The curriculum assumes two things: - You are reasonably fluent in English. - You have gotten through a standard high school curriculum that included physics and pre-calculus. Without these assumptions, the curriculum would be out of control with trying to fill in your knowledge gaps. For those who want to study math pre-requisites, read more [here](#how-can-i-review-the-math-prerequisites) Of course, if you find that the curriculum is missing a pre-requisite for a course that isn't part of a normal high school curriculum, please let us know! ### Why require experience with a sizable project before the Software Engineering courses? Software engineering tries to solve the problem of dealing with large programs. Building a sizable program before taking the SE courses will help you understand what SE is trying to solve. We recommend the Jack-to-VM-code compiler project from the nand2tetris course because it's the first project in the curriculum that is complex enough to see value in an SE course. That said, any sizable project will do and can come from outside of the OSSU curriculum. The idea is that you've done some large enough project where the pieces started to feel unmanageable. This experience will expose pain points and lead to a better understanding of SE. ### How can I find a course on a particular subject? After completing Core CS, learners are ready to pursue computer science topics of their own interest. How can one find a course on a given topic? For MOOCs an excellent resource is [Class Central](https://www.classcentral.com/). For materials from university courses that are online (but not organized) into a MOOC, [awesome-courses](https://github.com/prakhar1989/awesome-courses) and [cs-video-courses](https://github.com/Developer-Y/cs-video-courses) are good resources. For textbooks, [Goodreads](https://www.goodreads.com/genres/computer-science) is a great platform for reader ratings and reviews. For learning a particular programming language or framework, [see this question](#what-is-a-good-course-to-learn-a-particular-language). ================================================ FILE: HELP.md ================================================ # Getting help ## Check the FAQ! Please check our [Frequently Asked Questions](FAQ.md) to see if your question has been addressed. ## Ask in the chat room [](https://discord.gg/5pUhfpX) Join the OSSU [Discord server](https://discord.gg/5pUhfpX)! Discord is an online chat service, similar to Slack or IRC where you can chat with other students and get help. ### Specific problems If you need help successfully completing the content of a course or are having general technical difficulties, first reach out to the resources provided by the course (e.g. the course forum on Coursera, edX, etc). If you need additional help after that, post in Discord. **In your post, mention what steps you have already taken to try and solve the problem**. ### General problems If you have general problems with the program not specific to any course, such as preferring textbook-style learning over MOOCs, Discord is a good place to reach out to people who may have great suggestions. You might form a working group that makes the next improvement to OSSU CS! Read more about contributing [here](CONTRIBUTING.md). ================================================ FILE: LICENSE ================================================ The MIT License (MIT) Copyright (c) 2015-2023 Open Source Society University Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: README.md ================================================
# Contents - [Summary](#summary) - [Community](#community) - [Curriculum](#curriculum) - [Code of conduct](#code-of-conduct) - [Team](#team) # Summary The OSSU curriculum is a **complete education in computer science** using online materials. It's not merely for career training or professional development. It's for those who want a proper, *well-rounded* grounding in concepts fundamental to all computing disciplines, and for those who have the discipline, will, and (most importantly!) good habits to obtain this education largely on their own, but with support from a worldwide community of fellow learners. It is designed according to the degree requirements of undergraduate computer science majors, minus general education (non-CS) requirements, as it is assumed most of the people following this curriculum are already educated outside the field of CS. The courses themselves are among the very best in the world, often coming from Harvard, Princeton, MIT, etc., but specifically chosen to meet the following criteria. **Courses must**: - Be open for enrollment - Run regularly (ideally in self-paced format, otherwise running multiple times per year) - Be of generally high quality in teaching materials and pedagogical principles - Match the curricular standards of the [CS 2013](CURRICULAR_GUIDELINES.md): Curriculum Guidelines for Undergraduate Degree Programs in Computer Science When no course meets the above criteria, the coursework is supplemented with a book. When there are courses or books that don't fit into the curriculum but are otherwise of high quality, they belong in [extras/courses](extras/courses.md) or [extras/readings](extras/readings.md). **Organization**. The curriculum is designed as follows: - *Intro CS*: for students to try out CS and see if it's right for them - *Core CS*: corresponds roughly to the first three years of a computer science curriculum, taking classes that all majors would be required to take - *Advanced CS*: corresponds roughly to the final year of a computer science curriculum, taking electives according to the student's interests - *Final Project*: a project for students to validate, consolidate, and display their knowledge, to be evaluated by their peers worldwide **Duration**. It is possible to finish within about 2 years if you plan carefully and devote roughly 20 hours/week to your studies. Learners can use [this spreadsheet](https://docs.google.com/spreadsheets/d/1y2kMsIg9VaHMVmw35x_aH1hpty3V-ZMuV2jA13P_Cgo/copy) to estimate their end date. Make a copy and input your start date and expected hours per week in the `Timeline` sheet. As you work through courses you can enter your actual course completion dates in the `Curriculum Data` sheet and get updated completion estimates. > **Warning:** While the spreadsheet is a useful tool to estimate the time you need to complete this curriculum, it may not always be up-to-date with the curriculum. Use the [OSSU CS website](https://cs.ossu.dev) or [the repo](https://github.com/ossu/computer-science) to see what courses to do. **Cost**. All or nearly all course material is available for free. However, some courses may charge money for assignments/tests/projects to be graded. Note that both [Coursera](https://www.coursera.support/s/article/209819033-Apply-for-Financial-Aid-or-a-Scholarship?language=en_US) and [edX](https://courses.edx.org/financial-assistance/) offer financial aid. Decide how much or how little to spend based on your own time and budget; just remember that you can't purchase success! **Process**. Students can work through the curriculum alone or in groups, in order or out of order. - We recommend doing all courses in Core CS, only skipping a course when you are certain that you've already learned the material previously. - For simplicity, we recommend working through courses (especially Core CS) in order from top to bottom. Some students choose to study multiple courses at a time in order to vary the material they are working on in a day/week. A popular option is to take the math courses in parallel with the introductory courses. Course prerequisites are listed to help you determine if you are prepared for a given course. - Courses in Advanced CS are electives. Choose one subject (e.g. Advanced programming) you want to become an expert in and take all the courses under that heading. You can also create your own custom subject; the Discord community may provide feedback on your planned subject. **Content policy**. If you plan on showing off some of your coursework publicly, you must share only files that you are allowed to. *Respect the code of conduct* that you signed in the beginning of each course! **[How to contribute](CONTRIBUTING.md)** **[Getting help](HELP.md)** (Details about our FAQ and chatroom) # Community - We have a Discord server! [](https://discord.gg/wuytwK5s9h) This should be your first stop to talk with other OSSU students. Why don't you introduce yourself right now? [Join the OSSU Discord](https://discord.gg/wuytwK5s9h) - You can also interact through GitHub issues. If there is a problem with a course, or a change needs to be made to the curriculum, this is the place to start the conversation. Read more [here](CONTRIBUTING.md). - Add **Open Source Society University** to your [Linkedin](https://www.linkedin.com/school/11272443/) profile! > **Warning:** There are a few third-party/deprecated/outdated material that you might find when searching for OSSU. We recommend you to ignore them, and only use the [OSSU CS website](https://cs.ossu.dev) or [OSSU CS Github Repo](https://github.com/ossu/computer-science). Some known outdated materials are: > - An unmaintained and deprecated firebase app. Read more in the [FAQ](./FAQ.md#why-is-the-firebase-ossu-app-different-or-broken). > - An unmaintained and deprecated trello board > - Third-party notion templates # Curriculum - [Prerequisites](#prerequisites) - [Intro CS](#intro-cs) - [Core CS](#core-cs) - [Core programming](#core-programming) - [Core math](#core-math) - [CS Tools](#cs-tools) - [Core systems](#core-systems) - [Core theory](#core-theory) - [Core security](#core-security) - [Core applications](#core-applications) - [Core ethics](#core-ethics) - [Advanced CS](#advanced-cs) - [Advanced programming](#advanced-programming) - [Advanced systems](#advanced-systems) - [Advanced theory](#advanced-theory) - [Advanced information security](#advanced-information-security) - [Advanced math](#advanced-math) - [Final project](#final-project) --- ## Prerequisites - [Core CS](#core-cs) assumes the student has already taken [high school math](https://ossu.dev/precollege-math), including algebra, geometry, and pre-calculus. - [Advanced CS](#advanced-cs) assumes the student has already taken the entirety of Core CS and is knowledgeable enough now to decide which electives to take. - Note that [Advanced systems](#advanced-systems) assumes the student has taken a basic physics course (e.g. AP Physics in high school). ## Intro CS This course will introduce you to the world of computer science and programming. This course gives you a flavor of the material to come. If you finish the course wanting more, Computer Science is likely for you! **Topics covered**: `computation` `imperative programming` `basic data structures and algorithms` `and more` Courses | Duration | Effort | Prerequisites | Discussion :-- | :--: | :--: | :--: | :--: [Introduction to Computer Science and Programming using Python](coursepages/intro-cs/README.md) | 14 weeks | 6-10 hours/week | [high school algebra](https://ossu.dev/precollege-math) | [chat](https://discord.gg/jvchSm9) ## Core CS All coursework under Core CS is **required**, unless otherwise indicated. ### Core programming **Topics covered**: `functional programming` `design for testing` `program requirements` `common design patterns` `unit testing` `object-oriented design` `static typing` `dynamic typing` `ML-family languages (via Standard ML)` `Lisp-family languages (via Racket)` `Ruby` `and more` Courses | Duration | Effort | Prerequisites | Discussion :-- | :--: | :--: | :--: | :--: [Systematic Program Design](coursepages/spd/README.md) | 13 weeks | 8-10 hours/week | none | chat: [part 1](https://discord.gg/RfqAmGJ) / [part 2](https://discord.gg/kczJzpm) [Class-based Program Design](https://course.ccs.neu.edu/cs2510sp22/index.html) | 13 weeks | 5-10 hours/week | Systematic Program Design, High School Math | [chat](https://discord.com/channels/744385009028431943/891411727294562314) [Programming Languages](https://courses.cs.washington.edu/courses/cse341/19sp/#lectures) | 11 weeks | 4-8 hours/week | Systematic Program Design | [chat](https://discord.gg/8BkJtXN) [Object-Oriented Design](https://course.ccs.neu.edu/cs3500f19/) | 13 weeks | 5-10 hours/week | Class-based Program Design | [chat](https://discord.com/channels/744385009028431943/891412022120579103) [Software Architecture](https://www.coursera.org/learn/software-architecture) | 4 weeks | 2-5 hours/week | Object Oriented Design | [chat](https://discord.com/channels/744385009028431943/891412169638432788) ### Core math Discrete math (Math for CS) is a prerequisite and closely related to the study of algorithms and data structures. Calculus both prepares students for discrete math and helps students develop mathematical maturity. **Topics covered**: `discrete mathematics` `mathematical proofs` `basic statistics` `O-notation` `discrete probability` `and more` Courses | Duration | Effort | Notes | Prerequisites | Discussion :-- | :--: | :--: | :--: | :--: | :--: [Calculus 1A: Differentiation](https://openlearninglibrary.mit.edu/courses/course-v1:MITx+18.01.1x+2T2019/about) ([alternative](https://ocw.mit.edu/courses/mathematics/18-01sc-single-variable-calculus-fall-2010/index.htm)) | 13 weeks | 6-10 hours/week | The alternate covers this and the following 2 courses | [high school math](https://ossu.dev/precollege-math) | [chat](https://discord.gg/mPCt45F) [Calculus 1B: Integration](https://openlearninglibrary.mit.edu/courses/course-v1:MITx+18.01.2x+3T2019/about) | 13 weeks | 5-10 hours/week | - | Calculus 1A | [chat](https://discord.gg/sddAsZg) [Calculus 1C: Coordinate Systems & Infinite Series](https://openlearninglibrary.mit.edu/courses/course-v1:MITx+18.01.3x+1T2020/about) | 6 weeks | 5-10 hours/week | - | Calculus 1B | [chat](https://discord.gg/FNEcNNq) [Mathematics for Computer Science](https://openlearninglibrary.mit.edu/courses/course-v1:OCW+6.042J+2T2019/about) ([alternative](https://ocw.mit.edu/courses/6-042j-mathematics-for-computer-science-fall-2010/)) | 13 weeks | 5 hours/week | [2015/2019 solutions](https://github.com/spamegg1/Math-for-CS-solutions) [2010 solutions](https://github.com/frevib/mit-cs-math-6042-fall-2010-problems) [2005 solutions](https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-042j-mathematics-for-computer-science-fall-2005/assignments/). | Calculus 1C | [chat](https://discord.gg/EuTzNbF) ### CS Tools Understanding theory is important, but you will also be expected to create programs. There are a number of tools that are widely used to make that process easier. Learn them now to ease your future work writing programs. **Topics covered**: `terminals and shell scripting` `vim` `command line environments` `version control` `and more` Courses | Duration | Effort | Prerequisites | Discussion :-- | :--: | :--: | :--: | :--: [The Missing Semester of Your CS Education](https://missing.csail.mit.edu/) | 2 weeks | 12 hours/week | - | [chat](https://discord.gg/5FvKycS) ### Core systems **Topics covered**: `procedural programming` `manual memory management` `boolean algebra` `gate logic` `memory` `computer architecture` `assembly` `machine language` `virtual machines` `high-level languages` `compilers` `operating systems` `network protocols` `and more` Courses | Duration | Effort | Additional Text / Assignments| Prerequisites | Discussion :-- | :--: | :--: | :--: | :--: | :--: [Build a Modern Computer from First Principles: From Nand to Tetris](https://www.coursera.org/learn/build-a-computer) ([alternative](https://www.nand2tetris.org/)) | 6 weeks | 7-13 hours/week | - | C-like programming language | [chat](https://discord.gg/vxB2DRV) [Build a Modern Computer from First Principles: Nand to Tetris Part II](https://www.coursera.org/learn/nand2tetris2) | 6 weeks | 12-18 hours/week | - | one of [these programming languages](https://user-images.githubusercontent.com/2046800/35426340-f6ce6358-026a-11e8-8bbb-4e95ac36b1d7.png), From Nand to Tetris Part I | [chat](https://discord.gg/AsUXcPu) [Operating Systems: Three Easy Pieces](coursepages/ostep/README.md) | 10-12 weeks | 6-10 hours/week | - | Nand to Tetris Part II | [chat](https://discord.gg/wZNgpep) [Computer Networking: a Top-Down Approach](http://gaia.cs.umass.edu/kurose_ross/online_lectures.htm)| 8 weeks | 4–12 hours/week | [Wireshark Labs](http://gaia.cs.umass.edu/kurose_ross/wireshark.php) | algebra, probability, basic CS | [chat](https://discord.gg/MJ9YXyV) ### Core theory **Topics covered**: `divide and conquer` `sorting and searching` `randomized algorithms` `graph search` `shortest paths` `data structures` `greedy algorithms` `minimum spanning trees` `dynamic programming` `NP-completeness` `and more` Courses | Duration | Effort | Prerequisites | Discussion :-- | :--: | :--: | :--: | :--: [Algorithms: Design and Analysis, Part 1](https://www.edx.org/learn/algorithms/stanford-university-algorithms-design-and-analysis-part-1) ([alternative](https://www.algorithmsilluminated.org/)) | 8 weeks | 4-8 hours/week | any programming language, Mathematics for Computer Science | [chat](https://discord.gg/mKRS7tY) [Algorithms: Design and Analysis, Part 2](https://www.edx.org/learn/algorithms/stanford-university-algorithms-design-and-analysis-part-2) | 8 weeks | 4-8 hours/week | Algorithms Part 1 | [chat](https://discord.gg/Qstqe4t) ### Core security **Topics covered** `Confidentiality, Integrity, Availability` `Secure Design` `Defensive Programming` `Threats and Attacks` `Network Security` `Cryptography` `and more` Courses | Duration | Effort | Prerequisites | Discussion :-- | :--: | :--: | :--: | :--: [Cybersecurity Fundamentals](https://www.edx.org/learn/cybersecurity/rochester-institute-of-technology-cybersecurity-fundamentals) | 8 weeks | 10-12 hours/week | - | [chat](https://discord.gg/XdY3AwTFK4) [Principles of Secure Coding](https://www.coursera.org/learn/secure-coding-principles)| 4 weeks | 4 hours/week | - | [chat](https://discord.gg/5gMdeSK) [Identifying Security Vulnerabilities](https://www.coursera.org/learn/identifying-security-vulnerabilities) | 4 weeks | 4 hours/week | - | [chat](https://discord.gg/V78MjUS) Choose **one** of the following: Courses | Duration | Effort | Prerequisites | Discussion :-- | :--: | :--: | :--: | :--: [Identifying Security Vulnerabilities in C/C++ Programming](https://www.coursera.org/learn/identifying-security-vulnerabilities-c-programming) | 4 weeks | 5 hours/week | - | [chat](https://discord.gg/Vbxce7A) [Exploiting and Securing Vulnerabilities in Java Applications](https://www.coursera.org/learn/exploiting-securing-vulnerabilities-java-applications) | 4 weeks | 5 hours/week | - | [chat](https://discord.gg/QxC22rR) ### Core applications **Topics covered**: `Agile methodology` `REST` `software specifications` `refactoring` `relational databases` `transaction processing` `data modeling` `neural networks` `supervised learning` `unsupervised learning` `OpenGL` `ray tracing` `and more` Courses | Duration | Effort | Prerequisites | Discussion :-- | :--: | :--: | :--: | :--: [Databases: Modeling and Theory](https://www.edx.org/learn/databases/stanford-university-databases-modeling-and-theory)| 2 weeks | 10 hours/week | core programming | [chat](https://discord.gg/pMFqNf4) [Databases: Relational Databases and SQL](https://www.edx.org/learn/relational-databases/stanford-university-databases-relational-databases-and-sql)| 2 weeks | 10 hours/week | core programming | [chat](https://discord.gg/P8SPPyF) [Databases: Semistructured Data](https://www.edx.org/learn/relational-databases/stanford-university-databases-semistructured-data)| 2 weeks | 10 hours/week | core programming | [chat](https://discord.gg/duCJ3GN) [Machine Learning](https://www.deeplearning.ai/courses/machine-learning-specialization/)| 11 weeks | 9 hours/week | Basic coding | [chat](https://discord.gg/NcXHDjy) [Computer Graphics](https://www.edx.org/learn/computer-graphics/the-university-of-california-san-diego-computer-graphics) ([alternative](https://cseweb.ucsd.edu/~viscomp/classes/cse167/wi22/schedule.html))| 6 weeks | 12 hours/week | C++ or Java, [Basic Linear Algebra](https://ossu.dev/precollege-math/coursepages/precalculus) | [chat](https://discord.gg/68WqMNV) [Software Engineering: Introduction](https://www.edx.org/learn/software-engineering/university-of-british-columbia-software-engineering-introduction) ([alternative](https://github.com/ubccpsc/310/blob/main/resources/README.md)) | 6 weeks | 8-10 hours/week | Core Programming, and a [sizable project](FAQ.md#why-require-experience-with-a-sizable-project-before-the-Software-Engineering-courses) | [chat](https://discord.gg/5Qtcwtz) ### Core ethics **Topics covered**: `Social Context` `Analytical Tools` `Professional Ethics` `Intellectual Property` `Privacy and Civil Liberties` `and more` Courses | Duration | Effort | Prerequisites | Discussion :-- | :--: | :--: | :--: | :--: [Ethics, Technology and Engineering](https://www.coursera.org/learn/ethics-technology-engineering)| 9 weeks | 2 hours/week | none | [chat](https://discord.gg/6ttjPmzZbe) [Introduction to Intellectual Property](https://www.coursera.org/learn/introduction-intellectual-property)| 4 weeks | 2 hours/week | none | [chat](https://discord.gg/YbuERswpAK) [Data Privacy Fundamentals](https://www.coursera.org/learn/northeastern-data-privacy)| 3 weeks | 3 hours/week | none | [chat](https://discord.gg/64J34ajNBd) ## Advanced CS After completing **every required course** in Core CS, students should choose a subset of courses from Advanced CS based on interest. Not every course from a subcategory needs to be taken. But students should take *every* course that is relevant to the field they intend to go into. ### Advanced programming **Topics covered**: `debugging theory and practice` `goal-oriented programming` `parallel computing` `object-oriented analysis and design` `UML` `large-scale software architecture and design` `and more` Courses | Duration | Effort | Prerequisites :-- | :--: | :--: | :--: [Parallel Programming](https://www.coursera.org/learn/scala-parallel-programming)| 4 weeks | 6-8 hours/week | Scala programming [Compilers](https://www.edx.org/learn/computer-science/stanford-university-compilers) | 9 weeks | 6-8 hours/week | none [Introduction to Haskell](https://www.seas.upenn.edu/~cis194/fall16/)| 14 weeks | - | - [Learn Prolog Now!](https://www.let.rug.nl/bos/lpn//lpnpage.php?pageid=online) ([alternative](https://github.com/ossu/computer-science/files/6085884/lpn.pdf))*| 12 weeks | - | - [Software Debugging](https://www.youtube.com/playlist?list=PLAwxTw4SYaPkxK63TiT88oEe-AIBhr96A)| 8 weeks | 6 hours/week | Python, object-oriented programming [Software Testing](https://www.youtube.com/playlist?list=PLAwxTw4SYaPkWVHeC_8aSIbSxE_NXI76g) | 4 weeks | 6 hours/week | Python, programming experience (*) book by Blackburn, Bos, Striegnitz (compiled from [source](https://github.com/LearnPrologNow/lpn), redistributed under [CC license](https://creativecommons.org/licenses/by-sa/4.0/)) ### Advanced systems **Topics covered**: `digital signaling` `combinational logic` `CMOS technologies` `sequential logic` `finite state machines` `processor instruction sets` `caches` `pipelining` `virtualization` `parallel processing` `virtual memory` `synchronization primitives` `system call interface` `and more` Courses | Duration | Effort | Prerequisites | Notes :-- | :--: | :--: | :--: | :--: [Computation Structures 1: Digital Circuits](https://learning.edx.org/course/course-v1:MITx+6.004.1x_3+3T2016) [alternative 1](https://ocw.mit.edu/courses/6-004-computation-structures-spring-2017/) [alternative 2](https://ocw.mit.edu/courses/6-004-computation-structures-spring-2009/) | 10 weeks | 6 hours/week | [Nand2Tetris II](https://www.coursera.org/learn/nand2tetris2) | Alternate links contain all 3 courses. [Computation Structures 2: Computer Architecture](https://learning.edx.org/course/course-v1:MITx+6.004.2x+3T2015) | 10 weeks | 6 hours/week | Computation Structures 1 | - [Computation Structures 3: Computer Organization](https://learning.edx.org/course/course-v1:MITx+6.004.3x_2+1T2017) | 10 weeks | 6 hours/week | Computation Structures 2 | - ### Advanced theory **Topics covered**: `formal languages` `Turing machines` `computability` `event-driven concurrency` `automata` `distributed shared memory` `consensus algorithms` `state machine replication` `computational geometry theory` `propositional logic` `relational logic` `Herbrand logic` `game trees` `and more` Courses | Duration | Effort | Prerequisites :-- | :--: | :--: | :--: [Theory of Computation](https://ocw.mit.edu/courses/18-404j-theory-of-computation-fall-2020/) ([alternative](https://www.youtube.com/playlist?list=PLEE7DF8F5E0203A56)) | 13 weeks | 10 hours/week | [Mathematics for Computer Science](https://openlearninglibrary.mit.edu/courses/course-v1:OCW+6.042J+2T2019/about), logic, algorithms [Computational Geometry](https://www.edx.org/learn/geometry/tsinghua-university-ji-suan-ji-he-computational-geometry) | 16 weeks | 8 hours/week | algorithms, C++ [Game Theory](https://www.coursera.org/learn/game-theory-1) | 8 weeks | 3 hours/week | mathematical thinking, probability, calculus ### Advanced Information Security Courses | Duration | Effort | Prerequisites :-- | :--: | :--: | :--: [Web Security Fundamentals](https://www.edx.org/learn/computer-security/ku-leuven-web-security-fundamentals) | 5 weeks | 4-6 hours/week | understanding basic web technologies [Security Governance & Compliance](https://www.coursera.org/learn/security-governance-compliance) | 3 weeks | 3 hours/week | - [Digital Forensics Concepts](https://www.coursera.org/learn/digital-forensics-concepts) | 3 weeks | 2-3 hours/week | Core Security [Secure Software Development: Requirements, Design, and Reuse](https://www.edx.org/learn/software-development/the-linux-foundation-secure-software-development-requirements-design-and-reuse) | 7 weeks | 1-2 hours/week | Core Programming and Core Security [Secure Software Development: Implementation](https://www.edx.org/learn/software-development/the-linux-foundation-secure-software-development-implementation) | 7 weeks | 1-2 hours/week | Secure Software Development: Requirements, Design, and Reuse [Secure Software Development: Verification and More Specialized Topics](https://www.edx.org/learn/software-engineering/the-linux-foundation-secure-software-development-verification-and-more-specialized-topics) | 7 weeks | 1-2 hours/week | Secure Software Development: Implementation ### Advanced math Courses | Duration | Effort | Prerequisites | Discussion :-- | :--: | :--: | :--: | :--: [Essence of Linear Algebra](https://www.youtube.com/playlist?list=PLZHQObOWTQDPD3MizzM2xVFitgF8hE_ab) | - | - | [high school math](https://ossu.dev/precollege-math) | [chat](https://discord.gg/m6wHbP6) [Linear Algebra](https://ocw.mit.edu/courses/mathematics/18-06sc-linear-algebra-fall-2011/) | 14 weeks | 12 hours/week | corequisite: Essence of Linear Algebra | [chat](https://discord.gg/k7nSWJH) [Introduction to Numerical Methods](https://ocw.mit.edu/courses/mathematics/18-335j-introduction-to-numerical-methods-spring-2019/index.htm)| 14 weeks | 12 hours/week | [Linear Algebra](https://ocw.mit.edu/courses/mathematics/18-06sc-linear-algebra-fall-2011/) | [chat](https://discord.gg/FNEcNNq) [Introduction to Formal Logic](https://forallx.openlogicproject.org/) | 10 weeks | 4-8 hours/week | [Set Theory](https://www.youtube.com/playlist?list=PL5KkMZvBpo5AH_5GpxMiryJT6Dkj32H6N) | [chat](https://discord.gg/MbM2Gg5) [Probability](https://stat110.hsites.harvard.edu/) | 15 weeks | 5-10 hours/week | [Differentiation and Integration](https://www.edx.org/course/calculus-1b-integration) | [chat](https://discord.gg/UVjs9BU) ## Final project Part of learning is doing. The assignments and exams for each course are to prepare you to use your knowledge to solve real-world problems. After you've completed Core CS and the parts of Advanced CS relevant to you, you should identify a problem that you can solve using the knowledge you've acquired. You can create something entirely new, or you can improve some tool/program that you use and wish were better. Students who would like more guidance in creating a project may choose to use a series of project oriented courses. Here is a sample of options (many more are available, at this point you should be capable of identifying a series that is interesting and relevant to you): Courses | Duration | Effort | Prerequisites :-- | :--: | :--: | :--: [Fullstack Open](https://fullstackopen.com/en/) | 12 weeks | 15 hours/week | programming [Modern Robotics](https://modernrobotics.northwestern.edu) | 26 weeks | 2-5 hours/week | freshman-level physics, linear algebra, calculus, [linear ordinary differential equations](https://www.khanacademy.org/math/differential-equations) [Data Mining (Specialization)](https://www.coursera.org/specializations/data-mining) | 30 weeks | 2-5 hours/week | machine learning [Big Data (Specialization)](https://www.coursera.org/specializations/big-data) | 30 weeks | 3-5 hours/week | none [Internet of Things (Specialization)](https://www.coursera.org/specializations/internet-of-things) | 30 weeks | 1-5 hours/week | strong programming [Cloud Computing (Specialization)](https://www.coursera.org/specializations/cloud-computing) | 30 weeks | 2-6 hours/week | C++ programming [Data Science (Specialization)](https://www.coursera.org/specializations/jhu-data-science) | 43 weeks | 1-6 hours/week | none [Functional Programming in Scala (Specialization)](https://www.coursera.org/specializations/scala) | 29 weeks | 4-5 hours/week | One year programming experience [Game Design and Development with Unity 2020 (Specialization)](https://www.coursera.org/specializations/game-design-and-development) | 6 months | 5 hours/week | programming, interactive design ## Congratulations After completing the requirements of the curriculum above, you will have completed the equivalent of a full bachelor's degree in Computer Science. Congratulations! What is next for you? The possibilities are boundless and overlapping: - Look for a job as a developer! - Check out the [readings](extras/readings.md) for classic books you can read that will sharpen your skills and expand your knowledge. - Join a local developer meetup (e.g. via [meetup.com](https://www.meetup.com/)). - Pay attention to emerging technologies in the world of software development: + Explore the **actor model** through [Elixir](https://elixir-lang.org/), a new functional programming language for the web based on the battle-tested Erlang Virtual Machine! + Explore **borrowing and lifetimes** through [Rust](https://www.rust-lang.org/), a systems language which achieves memory- and thread-safety without a garbage collector! + Explore **dependent type systems** through [Idris](https://www.idris-lang.org/), a new Haskell-inspired language with unprecedented support for type-driven development.  # Code of conduct [OSSU's code of conduct](https://github.com/ossu/code-of-conduct). ## How to show your progress [Fork](https://www.freecodecamp.org/news/how-to-fork-a-github-repository/) the [GitHub repo](https://github.com/ossu/computer-science) into your own GitHub account and put ✅ next to the stuff you've completed as you complete it. This can serve as your [kanban board](https://en.wikipedia.org/wiki/Kanban_board) and will be faster to implement than any other solution (giving you time to spend on the courses). # Team * **[Eric Douglas](https://github.com/ericdouglas)**: founder of OSSU * **[Josh Hanson](https://github.com/joshmhanson)**: lead technical maintainer * **[Waciuma Wanjohi](https://github.com/waciumawanjohi)**: lead academic maintainer * **[Contributors](https://github.com/ossu/computer-science/graphs/contributors)** ================================================ FILE: _config.yml ================================================ title: Computer Science remote_theme: "jekyll/minima@7d91bb5" minima: skin: auto nav_pages: - FAQ.md - HELP.md include: ['CONTRIBUTING.md'] ================================================ FILE: _includes/custom-head.html ================================================ ================================================ FILE: _includes/footer.html ================================================ ================================================ FILE: _includes/nav-items.html ================================================ {%- for path in include.paths -%} {%- assign hyperpage = site.pages | where: "path", path | first -%} {%- if hyperpage.title %} {{ hyperpage.title | escape }} {%- endif -%} {%- endfor -%} GitHub ================================================ FILE: _layouts/page.html ================================================ --- layout: base ---
- You can enable automatic closing of parentheses, brackets, and quotes. Click on Edit in the Menu Bar > Preferences > Go to Editing Tab > Go to General Editing Sub-tab > Check the "Enable automatic parentheses, square brackets, and quotes" checkbox.
- You can use Ctrl + I to reindent the whole file.
- If you are on Windows or Linux, use Alt + Backspace to delete whole words.
- If you are unable to watch the videos on Edx for some reason, you can watch them on [this youtube channel](https://www.youtube.com/@systematicprogramdesign7962/playlists).
## FAQ
### This course is boring. Can I skip it?
**No.** This course may seem boring at first, but we suggest working though it. This is a great course, and it will probably change the way you think. Many students who found this course boring at first became a fan of the course by the time they completed it. Be very careful. The early parts (especially the rules about how evaluation works) plays a huge role in understanding how code works and gets executed for the rest of the course.
### Why is this course taught using BSL? Would it not make more sense to teach it in an industry standard language?
This is an intentional choice, and here's why:
1. Lisp is the lingua franca of computer scientists -- by which we mean, PhD algorithm researchers. There are some good and some merely historical reasons for this, but it's a fact of life, so if you want to read white papers you're going to want to read Lisp. BSL is a good introduction, and frankly once you get over the parenthesis hell and once you know any Lisp you know how to read them all.
2. This is the first computer science course in most people's curricula that isn't centered around teaching you how to use a language. Because the point of computer science isn't to teach you a language. Or to teach you to code. Or to teach you to be a fullstack software engineer. Computer Science is a very narrowly-applied applied math with wide-ranging practical usage. But if you strip away all the qualifying language, it's math. Which means it has certain overarching rules that are completely, totally independent of your implementation language.
This course is built in a throwaway student language, specifically so you don't focus on the language and instead focus on what you're doing with the language. We don't care about public static void main or PEP8 style. We want to see ways to structure a program in any language. So we focus not on the things that make Java unique, and not on the things that make Python unique, and instead focus on the things that make code better.
It might seem rough to learn a new language just to take this course, but BSL frees you from having to worry about style linting or runtime issues or code compartmentalization or compiling or coding environment. It's a gift. Take it. The design patterns are hard enough.
### Why there are different course versions, HTC, SPD? Why do you recommend the archived version?
There are two reasons people do these courses:
- The Knowledge
- The Certificate
OSSU assumes you're in it for the knowledge. You can have that for free. If you're doing it for the knowledge you don't need to submit your homework. You just need to do the homework.
If you want the recognition that you've done the thing, then you're in it for the certificate. You can't have the certificate for free. You have to pay for that.
There's no reason for you to submit homework sets unless you're doing it for the certificate -- If you're doing that, you can't actually get a certificate from the SPD course (because the course is expired) so you're in the wrong place.
If you want a certificate, then you need to take How To Code and you need to pay for it.
But you don't need to pay for anything in OSSU. We suggest you take SPD because the access to the information is better (because the course is expired) and it's more than sufficient for obtaining the knowledge.
TL;DR:
If you're in it for the knowledge, take SPD -- it's free but inactive
If you're in it for the certificate, take and pay for How To Code -- it's still an active course
### Can I do this course in another programming language?
This course has really integrated with the programming languages it uses. We suggest you to use the language specified by the course. While, the concepts you learn from this course are applicable anywhere, trying to do the course with another language is not really sensible, and would just lead to wastage of time.
### Can I use another IDE? I don't like Dr. Racket.
The programs in this course embed pictures and rich-text blocks in the code, which means, the files cannot be opened by other IDEs. While it is possible to prepare the starter files for use with other IDEs, you need Dr. Racket for that, and the time needed to do that can be better utilized in learning the concepts taught by the course.
### How do I test functions which are supposed to output random values?
You can use `check-random` to test those functions. You can [learn more about it here](https://docs.racket-lang.org/htdp-langs/beginner-abbr.html#(form._((lib._lang%2Fhtdp-beginner-abbr..rkt)._check-random))). It is needed for the Space Invaders project.
## Credits
The problem starter files and the space invaders instructions were taken from the course ["Systematic Program Design" on Edx](https://learning.edx.org/course/course-v1:UBCx+SPD1x+2T2015), licensed under [CC BY-NC-SA](https://creativecommons.org/licenses/by-nc-sa/4.0/) license.
================================================
FILE: extras/courses.md
================================================
# Computer Science - Great Courses
This is a list of high-quality courses that, for one reason or another, didn't make it into the curriculum.
The most common reasons are that the course isn't available often enough,
or that there was an alternative that fit better into the curriculum.
## Programming
Courses | Duration | Effort
:-- | :--: | :--:
[Introduction to Computational Thinking and Data Science](https://www.edx.org/learn/computer-science/massachusetts-institute-of-technology-introduction-to-computational-thinking-and-data-science#!)([alt](https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-0002-introduction-to-computational-thinking-and-data-science-fall-2016/))| 10 weeks | 15 hours/week
[Introduction to Computer Science - CS50](https://www.edx.org/learn/computer-science/harvard-university-cs50-s-introduction-to-computer-science#!) ([alt](https://cs50.harvard.edu/x/)) | 12 weeks | 10-20 hours/week
[Introduction to Computer Science (Udacity)](https://www.udacity.com/course/intro-to-computer-science--cs101)| 7 weeks | 10-20 hours/week
[An Introduction to Interactive Programming in Python (Part 1)](https://www.coursera.org/learn/interactive-python-1)| 5 weeks | -
[An Introduction to Interactive Programming in Python (Part 2)](https://www.coursera.org/learn/interactive-python-2)| - | -
[Computing In Python, Part I: Fundamentals and Procedural Programming](https://www.edx.org/learn/python/the-georgia-institute-of-technology-computing-in-python-i-fundamentals-and-procedural-programming) | 5 weeks | 10 hours/week
[Computing In Python, Part II: Control Structures](https://www.edx.org/learn/python/the-georgia-institute-of-technology-computing-in-python-ii-control-structures) | 5 weeks | 10 hours/week
[Computing In Python, Part III: Data Structures](https://www.edx.org/learn/python/the-georgia-institute-of-technology-computing-in-python-iii-data-structures) | 5 weeks | 10 hours/week
[Computing In Python, Part IV: Objects & Algorithms](https://www.edx.org/learn/python/the-georgia-institute-of-technology-computing-in-python-iv-objects-algorithms) | 5 weeks | 10 hours/week
[Programming Basics](https://www.edx.org/learn/computer-programming/iitbombay-programming-basics)| 9 weeks | 8 hours/week
[Object-Oriented Programming with Java](https://java-programming.mooc.fi/)| 14 weeks | 10 hours/week
[Introduction to Programming with MATLAB](https://www.coursera.org/learn/matlab)| - | -
[Introduction to Functional Programming](https://www.edx.org/learn/computer-programming/delft-university-of-technology-introduction-to-functional-programming)| 7 weeks | 4-6 hours/week
[The Structure and Interpretation of Computer Programs (2022, Python)](http://cs61a.org/) | - | -
[The Structure and Interpretation of Computer Programs (2011, Scheme)](https://romanbird.github.io/sicp/) | - | -
[Introduction to Haskell](https://www.seas.upenn.edu/~cis194/fall16/) | 14 weeks | 4 hours/week
## Math
Courses | Duration | Effort
:-- | :--: | :--:
[Effective Thinking Through Mathematics](https://www.edx.org/learn/math/the-university-of-texas-at-austin-effective-thinking-through-mathematics-2) | 4 weeks | 2 hours/week
[Introduction to Mathematical Thinking](https://www.coursera.org/learn/mathematical-thinking) | 10 weeks | 10 hours/week
[High School Math](https://www.khanacademy.org/math/high-school-math) | - | -
[Precalculus](https://www.futurelearn.com/courses/precalculus) | 5 weeks | 6 hours/week
[Advanced Precalculus](https://www.futurelearn.com/courses/advanced-precalculus) | 4 weeks | 5 hours/week
[Calculus Applied!](https://www.edx.org/learn/calculus/harvard-university-calculus-applied) | 10 Weeks | 6hours/week
[Introduction to Probability and Data](https://www.coursera.org/learn/probability-intro)| - | -
[Linear Algebra (Strang)](https://ocw.mit.edu/courses/mathematics/18-06-linear-algebra-spring-2010/index.htm) | - | -
[Introduction to Computational Thinking](https://computationalthinking.mit.edu/Spring21/#introduction_to_computational_thinking) | - | -
[Multivariable Calculus](https://ocw.mit.edu/courses/mathematics/18-02sc-multivariable-calculus-fall-2010/index.htm) | 13 weeks | 12 hours/week
[Introduction to Probability - The Science of Uncertainty](https://www.edx.org/learn/probability/massachusetts-institute-of-technology-probability-the-science-of-uncertainty-and-data) | 18 weeks | 12 hours/week
[Matrix Methods In Data Analysis, Signal Processing, And Machine Learning](https://ocw.mit.edu/courses/18-065-matrix-methods-in-data-analysis-signal-processing-and-machine-learning-spring-2018/) | - | -
## Systems
Courses | Duration | Effort
:-- | :--: | :--:
[Cloud Computing / Distributed Programming](https://www.coursera.org/learn/cloud-computing) | 5 weeks | 5-10 hours/week
[Introduction to Parallel Programming](https://www.udacity.com/course/--cs344) ([alt](https://www.youtube.com/playlist?list=PLGvfHSgImk4aweyWlhBXNF6XISY3um82_)) ([HW](https://colab.research.google.com/github/depctg/udacity-cs344-colab))| 12 weeks | 8-10 hours/week
[Intro to Computer Systems](http://www.cs.cmu.edu/afs/cs.cmu.edu/academic/class/15213-f15/www/) ([Labs](http://csapp.cs.cmu.edu/3e/labs.html)) | 15 weeks | 12 hours/week
[Great Ideas in Computer Architecture (Machine Structures)](https://web.archive.org/web/20190919235114/https://inst.eecs.berkeley.edu/~cs61c/fa14/) ([Lectures](https://archive.org/details/ucberkeley_webcast_itunesu_915550404)) | 15 weeks | 12 hours/week
[Computer Architecture](https://www.coursera.org/learn/comparch) | - | 5-8 hours/week
[Operating System Engineering](http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-828-operating-system-engineering-fall-2012/) | - | -
[Introduction to Operating Systems](https://www.udacity.com/course/operating-systems--ud923)| 8 weeks | 5-8 hours/week
[Advanced Operating Systems](https://www.udacity.com/course/ai-deep-learning--ud189)| 5 weeks | 5-8 hours/week
[Networking for Web Developers](https://www.udacity.com/course/computer-networking--ud436) | 12 weeks | 5-8 hours/week
Distributed Systems - [Playlist](https://www.youtube.com/playlist?list=PLrw6a1wE39_tb2fErI4-WkMbsvGQk9_UB), [Course site](http://nil.csail.mit.edu/6.824/2020/schedule.html), [Self-studying 6.824](https://lieuzhenghong.com/mit_6.824_self_study/) [6.824 Discord group for further help](https://discord.gg/KbhkEqpBqC) | - | -
## Theory
Courses | Duration | Effort
:-- | :--: | :--:
[Algorithms, Part I](https://www.coursera.org/learn/algorithms-part1) | 6 weeks | 6-12 hours/week
[Algorithms, Part II](https://www.coursera.org/learn/algorithms-part2) | 6 weeks | 6-12 hours/week
[Analysis of Algorithms (Sedgewick)](https://www.coursera.org/learn/analysis-of-algorithms) | 6 weeks | 6-8 hours/week
[Analysis of Algorithms (Skiena)](http://www3.cs.stonybrook.edu/~skiena/373/) | 15 weeks | 6-8 hours/week
[Programming Challenges (Skiena)](http://www3.cs.stonybrook.edu/~skiena/392/) | 14 weeks | 6-8 hours/week
[Data Structures and Algorithms (Specialization)](https://www.coursera.org/specializations/data-structures-algorithms) | 25 weeks | 3-10 hours/week
[Algorithmic Thinking (Part 1)](https://www.coursera.org/learn/algorithmic-thinking-1/) | - | -
[Algorithmic Thinking (Part 2)](https://www.coursera.org/learn/algorithmic-thinking-2/) | - | -
[Statistical Mechanics: Algorithms and Computations](https://www.coursera.org/learn/statistical-mechanics/) | - | -
[Approximation Algorithms Part I](https://www.coursera.org/learn/approximation-algorithms-part-1/) | - | -
[Approximation Algorithms Part II](https://www.coursera.org/learn/approximation-algorithms-part-2/) | - | -
[Design And Analysis Of Algorithms](https://ocw.mit.edu/courses/6-046j-design-and-analysis-of-algorithms-spring-2015/) | - | -
## Applications
Courses | Duration | Effort
:-- | :--: | :--:
[Using Databases with Python](https://www.coursera.org/learn/python-databases) | 5 weeks | 2-3 hours/week
[Database Systems](https://15721.courses.cs.cmu.edu/spring2016/) | 15 weeks | 12 hours/week
[Database Management Essentials](https://www.coursera.org/learn/database-management) | 7 weeks | 4-6 hours/week
[Intro to Artificial Intelligence](https://www.udacity.com/course/intro-to-artificial-intelligence--cs271)| 16 weeks | 6-10 hours/week
[Intro to Machine Learning](https://www.udacity.com/course/intro-to-machine-learning--ud120)| 10 weeks | 6-10 hours/week
[Big Data Science with the BD2K-LINCS Data Coordination and Integration Center](https://www.coursera.org/course/bd2klincs)| 7 weeks | 4-5 hours/week
## Tools
Courses | Duration | Effort
:-- | :--: | :--:
[How to Use Git and GitHub](https://www.udacity.com/blog/2015/06/a-beginners-git-github-tutorial.html) | 3 weeks | 2-3 hours/week
[Kubernetes Certified Application Developer](https://www.udemy.com/course/certified-kubernetes-application-developer/) | 5 weeks | 2 hours/week
# Online Learning - Great Courses
Courses | Duration | Effort
:-- | :--: | :--:
[Learning How to Learn](https://www.coursera.org/learn/learning-how-to-learn) | 4 weeks | 2 hours/week
[Mindshift](https://www.coursera.org/learn/mindshift) | 4 weeks | 2 hours/week
[Powersearching with Google](https://www.edx.org/learn/google-power-searching/google-power-searching-with-google) | 3 weeks | 4-6 hours/week
================================================
FILE: extras/other_curricula.md
================================================
# Other curricula
OSSU is one of a few efforts to inform learners how they can pursue computer science independently. Below are a few other such efforts.
- [Google - Guide for Technical Development](https://www.google.com/about/careers/students/guide-to-technical-development.html)
- [Teach Yourself Computer Science](https://teachyourselfcs.com/)
- [Obtaining a Thorough CS Background Online](http://spin.atomicobject.com/2015/05/15/obtaining-thorough-cs-background-online/)
- [P1xt](https://github.com/P1xt/p1xt-guides)
- [Functional CS](https://functionalcs.github.io/curriculum/)
What differentiates OSSU? OSSU is dedicated to how an individual can learn the undergraduate CS curriculum. This is why we use the [CS2013](../CURRICULAR_GUIDELINES.md) as our curricular guidelines. These guidelines are written by the two foremost professional organizations in computing.
This approach has the benefit of clarifying to others the extent of a student's study and understanding. Students have gone from OSSU study into both tech industry employment and into Computer Science graduate school. We look forward to helping you do the same.
================================================
FILE: extras/puzzles-practice-plods.md
================================================
# Computer Science - Puzzles, Practice and Plods
**Some OSSUnians value sites that allow them to practice coding problems disconnected from a course.**
> Solving "textbook" problems is easy because we've been prepped for them by the course. Solving a "real world" example is much more difficult because there is no hand-holding.
[link](https://github.com/ossu/computer-science/issues/783#issuecomment-694187743)
> So give us a problem where the parameters are laid out in x,y fashion, and we'll be able to code for it. But confront us with another problem, and it might stump us since we're still not practiced with thinking algorithmically or what have you.
[link](https://github.com/ossu/computer-science/issues/783#issuecomment-694176898)
**Others feel that its important not to get distracted by anxieties and puzzles.**
> Consider this a love letter to all the beginners out there.
> I think that when you are still in the beginner stages, it FEELS like you do not have enough competence to contributing to a project.
It FEELS like taking classes, doing programming assignments etc. are not good enough in your eyes to be considered worthy of a "project".
They feel too small and insignificant. You're not quite satisfied.
(Part of the reason might be that early stuff is too easy for you, and you haven't taken a course that kicked your ass and wiped the floor with you yet.)
Since this is online learning and there is nobody/nothing holding you back, the natural tendency is to spread wide and try to do many things all at once, get distracted.
I'VE BEEN THERE, trust me.
And naturally you are in a rush to become competent as fast as possible.
You keep thinking, "when will I be ready to do something BIG?" And you don't want to wait.
Similar to how children always seem like they are in a hurry to grow up and start imitating adults.
The dissatisfaction and the impatience make for an uncomfortable combination.
Let's call this: beginner's mind.
> The fact is, you have to be patient.
I would argue that early on in your studies, arguably, is NOT when it is most critical for you to contribute to a project...
> I would recommend the slow, steady and patient approach of OSSU over the distracted, all over the place style of learning lots of others use, with various uncoordinated resources on the internet.
Looking for a project? How about THE NEXT COURSE?
> So I think that the problem is not really a problem, but a need to adjust expectations.
I would recommend a shift in thinking, away from beginner's mind.
Think long term, so that those small, insignificant exercises and programming assignments in each course should feel like they are crucial parts of your biggest, long-term project: YOU
[link](https://github.com/ossu/computer-science/issues/783#issuecomment-690023645)
So OSSUnian, read the above and then consider how much time you wish to put into these resources:
- [Exercism](https://exercism.io/)
- [LeetCode](https://leetcode.com/)
- [HackerRank](https://www.hackerrank.com/)
- [CodeWars](https://www.codewars.com/)
- [100+ Python Coding Problems with Solutions](https://github.com/ProgrammingHero1/100-plus-python-coding-problems-with-solutions)
- [Rosalind](http://rosalind.info/problems/locations/)
- [Advent of Code](https://adventofcode.com/)
- [GitHub projects for beginners](https://github.com/MunGell/awesome-for-beginners) - Projects that are specifically geared towards beginners to GitHub. Possibly intermediate to advanced coding issues to be solved.
================================================
FILE: extras/readings.md
================================================
# Computer Science - Great Readings
This document consists of great books or articles on computer science.
Some are here because there is a course covering the same material;
some are just great books that you should read at some point in your career.
Once you have made it through most of the curriculum, knowing whether a book is worth your time will become easier.
Or, if you are struggling in one of the courses, perhaps reading a book on the subject will help.
## Programming
Name | Author(s)
:-- | :--:
[Introduction to Computation and Programming Using Python 3e](https://mitpress.mit.edu/books/introduction-computation-and-programming-using-python-third-edition) | John V. Guttag
[Think Python 2e](http://greenteapress.com/wp/think-python-2e/) | Allen B. Downey
[How to Design Programs 2e](https://www.htdp.org/) | Matthias Felleisen, Robert Bruce Findler, Matthew Flatt, Shriram Krishnamurthi
[Structure and Interpretation of Computer Programs 2e](https://mitpress.mit.edu/sites/default/files/sicp/full-text/book/book.html) | Hal Abelson, Jerry Sussman, Julie Sussman
[The Structure and Interpretation of Computer Programs (2021, JavaScript)](https://sourceacademy.org/sicpjs/index) | Harold Abelson, Gerald Jay Sussman, Julie Sussman, Martin Henz, Tobias Wrigstad and Samuel Fang
[Concepts, Techniques, and Models of Computer Programming](https://www.amazon.com/gp/product/0262220695) | Peter Van Roy, Seif Haridi
[Design Patterns: Elements of Reusable Object-Oriented Software](https://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612) | Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides
[Refactoring](https://www.refactoring.com/) | Martin Fowler
[Clean Code](https://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882) | Robert Martin
[Code Complete 2e](https://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670) | Steve McConnell
[The Pragmatic Programmer 2e](https://pragprog.com/titles/tpp20/the-pragmatic-programmer-20th-anniversary-edition/) | Andrew Hunt, David Thomas
[Programming Languages: Application and Interpretation](http://cs.brown.edu/~sk/Publications/Books/ProgLangs/) | Shriram Krishnamurthi
[Programming and Programming Languages](https://papl.cs.brown.edu/2018/) | Shriram Krishnamurthi, Benjamin S. Lerner, Joe Gibbs Politz
[Competitive Programming](https://cpbook.net/) | Steven Halim, Felix Halim
[Introduction to computing in Java](https://introcs.cs.princeton.edu/java/home/) | Robert Sedgewick, Kevin Wayne
## Math
Name | Author(s)
:-- | :--:
[Calculus Made Easy](http://www.gutenberg.org/ebooks/33283) | Silvanus P. Thompson
[Ximera: Interactive Calculus Textbooks](https://ximera.osu.edu/) | [Ximera team](https://ximera.osu.edu/about/team)
[Discrete Mathematics with Applications (4th Edition)](http://www.amazon.com/Discrete-Mathematics-Applications-Susanna-Epp/dp/0495391328/) | Susanna S. Epp
[Discrete Mathematics: An Open Introduction](https://discrete.openmathbooks.org/dmoi4/frontmatter.html) | Oscar Levin
[Applied Discrete Structures](http://faculty.uml.edu/klevasseur/ads2/) | Alan Doerr, Ken Levasseur
[Grinstead and Snell’s Introduction to Probability](https://math.dartmouth.edu/~prob/prob/prob.pdf) | Charles M. Grinstead, J. Laurie Snell
[Linear Algebra for Everyone](https://math.mit.edu/~gs/everyone/) | Gilbert Strang
[The Art of Linear Algebra](https://github.com/kenjihiranabe/The-Art-of-Linear-Algebra) | Kenji Hiranabe, Gilbert Strang
## Systems
Name | Author(s)
:-- | :--:
[But How Do It Know?](http://www.buthowdoitknow.com/) | J. Clark Scott
[Computer Systems: A Programmer's Perspective (3rd Edition)](http://csapp.cs.cmu.edu/) | Randal E. Bryant, David R. O'Hallaron
[Modern Operating Systems (4th Edition)](http://www.amazon.com/Modern-Operating-Systems-Andrew-Tanenbaum/dp/013359162X/) | Andrew S. Tanenbaum, Herbert Bos
[Computer Organization and Design: The Hardware/Software Interface (6th Edition)](https://www.amazon.com/Computer-Organization-Design-MIPS-Architecture/dp/0128201096/) | David Patternson, John Hennessy
[Computer Networks (5th Edition)](http://www.amazon.com/Computer-Networks-5th-Andrew-Tanenbaum/dp/0132126958/) | Andrew S. Tanenbaum, David J. Wetherall
[Computer Networking: A Top-Down Approach (8th Edition)](https://gaia.cs.umass.edu/kurose_ross/index.html) | James F Kurose, Keith W Ross
[Computer Networks: A Systems Approach](https://book.systemsapproach.org/) | Larry Peterson and Bruce Davie
[Distributed Systems: Principles and Paradigms](https://www.amazon.com/Distributed-Systems-Principles-Andrew-Tanenbaum/dp/153028175X) | Andrew Tanenbaum
[Operating Systems Design and Implementation](https://www.amazon.com/Operating-Systems-Design-Implementation-3rd/dp/0131429388) | Andrew S. Tanenbaum, Albert S. Woodhull
[Crafting Interpreters](https://www.craftinginterpreters.com/contents.html) | Robert Nystrom
[Principles of Compiler Design](https://www.amazon.com/Principles-Compiler-Addison-Wesley-information-processing/dp/0201000229) | Alfred Aho, Jeffrey Ullman
[Distributed Systems Reading Group](http://dsrg.pdos.csail.mit.edu/papers/) | Various
[System Design: Design large-scale systems](https://github.com/donnemartin/system-design-primer) | Various
## Theory
Name | Author(s)
:-- | :--:
[Introduction to Computing: Explorations in Language, Logic, and Machines](http://www.computingbook.org/) | David Evans
[Introduction to the Theory of Computation (3rd Edition)](https://www.amazon.com/Introduction-Theory-Computation-Michael-Sipser/dp/113318779X) | Michael Sipser
[Introduction to Algorithms (3rd Edition)](http://www.amazon.com/Introduction-Algorithms-3rd-MIT-Press/dp/0262033844/) | Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein
[The Algorithm Design Manual (3rd Edition)](https://www.algorist.com/) | Steven Skiena
[Algorithms (4th Edition)](https://algs4.cs.princeton.edu/home/) | Robert Sedgewick
[Algorithms Illuminated](https://algorithmsilluminated.org/) | Tim Roughgarden
[Category Theory: A Gentle Introduction](http://www.logicmatters.net/resources/pdfs/GentleIntro.pdf) | Peter Smith
[Category Theory for Programmers: The Preface](https://bartoszmilewski.com/2014/10/28/category-theory-for-programmers-the-preface/) | Bartosz Milewski
[An Introduction to Information Retrieval](https://nlp.stanford.edu/IR-book/pdf/irbookonlinereading.pdf) | Christopher D. Manning, Prabhakar Raghavan, Hinrich Schütze
[Computer Science: An interdisciplinary approach](https://introcs.cs.princeton.edu/java/cs/) | Robert Sedgewick, Kevin Wayne
[DSA CS3: Data Structures & Algorithms](https://opendsa-server.cs.vt.edu/OpenDSA/Books/CS3/html/) ([Coursenotes](https://opendsa-server.cs.vt.edu/OpenDSA/Books/CS3notes/html/) - [Slides](https://opendsa-server.cs.vt.edu/OpenDSA/Books/CS3slides/html/)) | The OpenDSA Project (supported by National Science Foundation)
## Applications
Name | Author(s)
:-- | :--:
[Architecture of a Database System](http://db.cs.berkeley.edu/papers/fntdb07-architecture.pdf) | Joseph M. Hellerstein, Michael Stonebraker, James Hamilton
[Readings in Database Systems (5th Edition)](http://www.redbook.io/) | Peter Bailis, Joseph M. Hellerstein, Michael Stonebraker, editors
[Database Management Systems (3rd Edition)](https://www.amazon.com/gp/product/0072465638) | Raghu Ramakrishnan, Johannes Gehrke
[Transaction Processing: Concepts and Techniques](https://www.amazon.com/Transaction-Processing-Concepts-Techniques-Management/dp/1558601902) | Jim Gray, Andreas Reuter
[Data and Reality: A Timeless Perspective on Perceiving and Managing Information in Our Imprecise World (3rd Edition)](https://www.amazon.com/Data-Reality-Perspective-Perceiving-Information/dp/1935504215) | William Kent
[The Architecture of Open Source Applications](http://aosabook.org/en/) | Michael DiBernardo (editor)
[An Introduction to Statistical Learning](https://www-bcf.usc.edu/~gareth/ISL/) | Gareth James, Daniela Witten, Trevor Hastie and Robert Tibshirani
[Deep Learning](http://www.deeplearningbook.org/) | Ian Goodfellow, Yoshua Bengio and Aaron Courville
[Bayesian Reasoning and Machine Learning](http://web4.cs.ucl.ac.uk/staff/D.Barber/pmwiki/pmwiki.php?n=Brml.HomePage) | David Barber
[Language Implementation Patterns](https://www.amazon.com/gp/product/193435645X) | Terence Parr
[Compilers: Principles, Techniques, and Tools (2nd Edition)](http://www.amazon.com/Compilers-Principles-Techniques-Tools-2nd/dp/0321486811/) | Alfred V. Aho, Monica S. Lam, Ravi Sethi, Jeffrey D. Ullman
[Compiler Construction](https://inf.ethz.ch/personal/wirth/CompilerConstruction/index.html) | Niklaus Wirth
[The Mythical Man-Month](https://www.amazon.com/Mythical-Man-Month-Software-Engineering-Anniversary/dp/0201835959/) | Fred Brooks, Jr.
[Physically Based Rendering: From Theory To Implementation](http://www.pbr-book.org/) | Matt Pharr, Wenzel Jakob, and Greg Humphreys
## Tools
Name | Author(s)
:-- | :--:
[The Linux Command Line](https://linuxcommand.org/tlcl.php) | by William Shotts