├── .github └── ISSUE_TEMPLATE │ └── request-for-comment-template.md ├── .gitignore ├── CHANGELOG.md ├── CONTRIBUTING.md ├── CURRICULAR_GUIDELINES.md ├── FAQ.md ├── HELP.md ├── LICENSE ├── PROJECTS.md ├── README.md ├── coursepages └── ostep │ ├── Project-1B-initial-xv6.md │ ├── Project-2A-processes-shell.md │ ├── README.md │ ├── Reading-order.md │ ├── Scheduling-xv6-lottery.md │ └── vm-xv6-intro.md └── extras ├── courses.md ├── other_curricula.md ├── puzzles-practice-plods.md └── readings.md /.github/ISSUE_TEMPLATE/request-for-comment-template.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Request for Comment Template 3 | about: Template for creating an RFC to modify the curriculum 4 | title: 'RFC: ' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Problem:** 11 | 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: 12 | 13 | * OSSU lists course X as required when the course's topics are elective in our curricular guidelines. 14 | * OSSU does not having a course to cover required topic X from our curricular guidelines. 15 | * OSSU lists courses X, Y and Z that cover the same topics when fewer courses could suffice. 16 | * OSSU recommends course X to teach a topic, but there exists a higher quality course that covers the same material. 17 | 18 | **Duration:** 19 | This should most often be 1 month from the date of posting. 20 | 21 | **Background:** 22 | 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. 23 | 24 | **Proposal:** 25 | Give a bullet point list of changes that are being proposed. These can link to a Pull Request. 26 | 27 | **Alternatives:** 28 | Give a bullet point list of alternative ways to address the problem. 29 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | *.swp 3 | *.swo 4 | .direnv/ 5 | .envrc 6 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | **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. 4 | 5 | All notable changes to this project will be documented in this file. 6 | This project adheres *in spirit* to [Semantic Versioning](http://semver.org/): 7 | - "MAJOR" updates correspond to changing the topics studied within a subject 8 | - "MINOR" updates correspond to changing courses without changing the topics 9 | - "PATCH" updates correspond to aesthetic and non-essential additions/removals or changing order of classes for better progression 10 | 11 | ## [8.0.0] 2017-11-01 12 | ### Added 13 | - extras/readings: "The System Design Primer" 14 | - extras/readings: "Category Theory for Programmers: The Preface" 15 | - extras/readings: "Programming Languages: Application and Interpretation" 16 | - extras/readings: "Programming and Programming Languages" 17 | - CONTRIBUTING: "Learning Git" section to the contributor guidelines page 18 | - Core Math: Added "Essence of Linear Algebra" as pre-requisite to "Linear Algebra: Foundations to Frontiers" 19 | 20 | ### Updated 21 | - Moved "Introduction to Mathematical Thinking" to extras/courses 22 | - Moved "Hack the Kernel" (ops-class) from Advanced Systems to Core Systems 23 | - Core Systems: "Operating Systems: Three Easy Pieces" is no longer required, but is recommended as companion text to "Hack the Kernel" 24 | - Core Theory: Replaced Coursera with Lagunita as the host for Stanford Algorithms, since Coursera uses dark patterns to trick users into paying 25 | 26 | ## [7.2.2] 2017-07-02 27 | ### Added 28 | - "Haskell Programming from First Principles" book as a paid alternative to learn Haskell 29 | - "Think Python" to extras/readings 30 | - FAQ entries and links under relevant courses 31 | - "Category Theory: A Gentle Introduction" to extras/readings 32 | 33 | ## [7.2.1] 2017-05-14 34 | ### Updated 35 | - Networking course should take 8 weeks to complete 36 | - Fixed spelling error 37 | 38 | ### Added 39 | - Introduction to Haskell course to [extras/courses](extras/courses.md) 40 | 41 | ## [7.2.0] 2017-04-28 42 | ### Added 43 | - Software Testing course 44 | - Link to Stanford Lagunita's Algorithms: Design and Analysis 45 | - 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 46 | 47 | ## [7.1.2] 2017-04-22 48 | ### Updated 49 | - Add link to Mega Project List in the introduction of the Projects section 50 | 51 | ## [7.1.1] 2017-04-11 52 | ### Updated 53 | - Final touch to release 54 | 55 | ## [7.1.0] 2017-04-10 56 | ### Updated 57 | - Reverted reformat of programming languages course 58 | 59 | ### Added 60 | - Reliable Distributed Algorithms courses 61 | - New Introduction to CS course 62 | 63 | ## [7.0.2] 2017-03-30 64 | ### Updated 65 | - Moved optional online learning courses to extras/courses in a new section 66 | - Moved alternate computer architecture course to extras/courses 67 | 68 | ### Added 69 | - Scala specialization under Advanced applications 70 | 71 | ### Removed 72 | - Removed all but one choice for required readings to make the curriculum simpler 73 | 74 | ## [7.0.1] 2017-03-11 75 | ### Updated 76 | - Fixed link to Bradfield's DIY computer science page 77 | 78 | ### Added 79 | - Note under Calculus One with links to errata and course progression recommendations 80 | - Optional courses under extras: 81 | - Strang's course on linear algebra 82 | - Berkeley's Structure and Interpretation of Computer Programs 83 | - Optional readings under extras: 84 | - Van Roy's advanced programming book 85 | - P&H's computer architecture book 86 | - Skiena's algorithms book 87 | - Strang's linear algebra book 88 | - Database Management Systems book 89 | - Tarr's book on creating your own Domain-specific language 90 | - Readings from various authors on distributed systems 91 | 92 | ## [7.0] 2017-03-09 93 | Complete overhaul of program structure 94 | 95 | ### Updated 96 | - Clarified contributor guidelines and moved them to separated file 97 | - Switched from many subjects to just four subjects with many topics 98 | - Consolidated free-books.md and paid-books.md into readings.md 99 | - Consolidated free-courses.md and paid-courses.md into courses.md 100 | - Replace old "How to Code" with new "How to Code" (Software Development MicroMasters) 101 | - Replace Princeton Algorithms (moved to [alternative courses](#extras/courses.md)) with Stanford Algorithms 102 | 103 | ### Added 104 | - Indicate prerequisites for all courses 105 | - Requirements: subject/topic requirements and project requirements 106 | - Required readings on Haskell, Prolog, Operating Systems 107 | - Courses: Dan Grossman's Programming Languages 108 | - Courses: From Nand to Tetris 109 | - Elective course: Intro to Parallel Programming 110 | - Elective course: LAFF: Programming for Correctness 111 | - Elective course: Introduction to Mathematical Thinking 112 | - Elective courses: Electricity and Magnetism 113 | - Elective courses: MIT's Computation Structures 114 | - Elective course: Multivariable Calculus 115 | - Elective course: ops-class.org 116 | - Elective course: Automata Theory 117 | - Elective course: Introduction to Logic 118 | - Elective course: Computational Geometry 119 | - Elective course: Formal Concept Analysis 120 | - Elective course: Game Theory 121 | - Elective specializations: 122 | - Robotics 123 | - Data Mining 124 | - Big Data 125 | - Internet of Things 126 | - Cloud Computing 127 | - Full Stack Web Development 128 | - Data Science 129 | - Pro specializations: 130 | - Mastering Software Development in R 131 | - Artificial Intelligence Engineer 132 | - Machine Learning Engineer 133 | - Cybersecurity 134 | - Android Developer 135 | 136 | ### Removed 137 | - Removed many dead links and obsolete courses 138 | - Removed per-course project requirement 139 | - Course: Object-Oriented Programming in Java 140 | - Course: Functional Programming in Scala 141 | - Course: Computer Architecture (but left as a footnote) 142 | - Course: Intro to Theoretical Computer Science 143 | - Course: Software Processes and Agile Practices 144 | - Course: Operating Systems & System Programming 145 | - Course: Introduction to Cyber Security 146 | - Course: Parallel Computer Architecture and Programming 147 | - Course: UX Design for Mobile Developers 148 | 149 | ## [6.0] 2016-10-09 150 | ### Updated 151 | - Put Calculus One before and together with Mathematics for Computer Science 152 | - Improve text in "Order of the classes" 153 | 154 | ### Added 155 | - Create public Trello board with the new curriculum version 156 | - Create the section "How to track and show your progress" in "How to use this guide" 157 | - Add PROJECTS.md file 158 | - Copy all sections of curriculum to PROJECTS.md 159 | 160 | ### Removed 161 | - Remove "Next Goals" section 162 | - Remove reference to OSSU web app 163 | 164 | ## [5.1.0] 2016-08-20 165 | Update to latest version of Math for Computer Science: 166 | 167 | ### Updated 168 | - Section: **Math (Discrete Math)** 169 | - Mathematics for Computer Science 170 | 171 | ## [5.0.0] 2016-08-20 172 | Due to removed course, we had the following updates: 173 | 174 | ### Removed 175 | - Section: **Natural Language Processing** 176 | - Natural Language Processing 177 | 178 | ### Added 179 | - Section: **Natural Language Processing** 180 | - Introduction to Natural Language Processing 181 | 182 | ## [4.1.0] 2016-08-05 183 | Due to Coursera's platform changes, we had the following updates: 184 | ### Fixed 185 | - Section: **Big Data** 186 | - Introduction to Big Data 187 | 188 | ## [4.0.0] 2016-07-30 189 | Due to Coursera's platform changes, we had the following updates: 190 | 191 | ### Removed 192 | - Section: **Theory** 193 | - Automata 194 | - Section: **Math (Linear Algebra)** 195 | - Coding the Matrix: Linear Algebra through Computer Science Applications 196 | - Section: **Parallel Computing** 197 | - Heterogeneous Parallel Programming 198 | - Section: **Natural Language Processing** 199 | - Natural Language Processing 200 | 201 | ### Fixed 202 | - Section: **Computer Networks** 203 | - Computer Networks 204 | - Section: **Compilers** 205 | - Compilers 206 | 207 | ### Added 208 | - Section: **Theory** 209 | - Intro to Theoretical Computer Science 210 | - Section: **Math (Linear Algebra)** 211 | - Linear Algebra - Foundations to Frontiers 212 | - Section: **Parallel Computing** 213 | - Parallel Computer Architecture and Programming 214 | - Section: **Natural Language Processing** 215 | - Natural Language Processing 216 | 217 | ## [3.0.0] 2016-05-04 218 | ### Removed 219 | - Section: **Introduction to Computer Science**: 220 | - Introduction to Computer Science and Programming Using Python 221 | - From Nand to Tetris (Part 1) 222 | 223 | ### Added 224 | - Section: **Introduction to Computer Science**: 225 | - Introduction to Computer Science - CS50 226 | 227 | ## [2.0.1] 2016-04-04 228 | ### Fixed 229 | - Now students should enroll through our [web app](https://ossu.firebaseapp.com). 230 | 231 | ## [2.0.0] 2016-03-17 232 | ### Fixed 233 | - Program Design section course's names and links 234 | 235 | ### Removed 236 | - **Introduction to Computer Science**: 237 | - Introduction to Computer Science 238 | - Introduction to Computational Thinking and Data Science 239 | - **Algorithms** 240 | - Analysis of Algorithms 241 | - **Programming Paradigms** 242 | - Principles of Reactive Programming 243 | - **Math (Calculus)** 244 | - Multivariable Calculus 245 | - **Software Architecture**: 246 | - Web Application Architectures 247 | - **Software Engineering**: 248 | - Agile Development Using Ruby on Rails - Basics 249 | - Agile Development Using Ruby on Rails - Advanced 250 | - Startup Engineering 251 | - **Computer Architecture**: 252 | - The Hardware/Software Interface 253 | - **Operating Systems**: 254 | - Operating System Engineering 255 | - **Computer Networks**: 256 | - Introduction to Computer Networking 257 | - **Cryptography**: 258 | - Applied Cryptography 259 | 260 | **ps**: These removed courses are now in the [extras](https://github.com/ossu/computer-science/tree/master/extras) section. 261 | 262 | ## [1.3.12] 2016-03-17 263 | ### Added 264 | - How to collaborate: send new links to the extras section 265 | 266 | ## [1.3.11] 2016-03-06 267 | ### Fixed 268 | - Nand to Tetris: change name and url 269 | - UC Berkeley Agile development: change name and url 270 | - Direct links to specializations 271 | 272 | ## [1.3.10] 2016-03-06 273 | ### Fixed 274 | - Link from Systematic Program Design Part 2 course 275 | 276 | ## [1.3.9] 2015-11-09 277 | ### Fixed 278 | - Link for the correct Natural Language Processing course 279 | 280 | ## [1.3.8] 2015-11-07 281 | ### Added 282 | - Add "Project Suggestions" section with more references 283 | 284 | ## [1.3.7] 2015-11-01 285 | ### Removed 286 | - Removed project.md file, moved to **help** repo 287 | 288 | ## [1.3.6] 2015-10-22 289 | ### Added 290 | - Latest version of CS 162, Operating Systems and System Programming 291 | 292 | ## [1.2.6] 2015-10-19 293 | ### Added 294 | - Badge/Link to the Awesome list 295 | 296 | ## [1.2.5] 2015-10-16 297 | ### Fixed 298 | - Fix name of the section and add a hyperlink to it. 299 | 300 | ## [1.2.4] 2015-10-14 301 | ### Removed 302 | - Removed citation about public commitment 303 | 304 | ## [1.2.3] 2015-10-12 305 | ### Changed 306 | - Updated the prerequisite section for more clarity 307 | 308 | ## [1.2.2] 2015-10-12 309 | ### Fixed 310 | - New link to issue intended for students' enrollment 311 | 312 | ## [1.2.1] 2015-10-11 313 | ### Added 314 | - Article Git - the simple guide to the prerequisite section 315 | 316 | ##[1.1.1] 2015-10-11 317 | ### Fixed 318 | - Fix typos 319 | - As MOOC is a "Massive Open Online Course" MOOC course is redundant 320 | - Elaborated on "real problem" 321 | - Fixed a few small grammatical and wording errors 322 | 323 | ## [1.1.0] 2015-10-08 324 | ### Added 325 | - Motivation & Preparation section (optional resources) 326 | - Article: MIT Challenge 327 | - Course: Learning How to Learn 328 | 329 | ## [1.0.0] 2015-10-08 330 | 331 | Release of the first **complete** version of the Computer Science curriculum 332 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Changing the curriculum 2 | OSSU thrives because of the changes made by our many contributors. Read on for details on how to help every student that follows you. 3 | ## Non-substantive changes 4 | 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. 5 | ## Substantive changes 6 | 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. 7 | OSSU’s curricular guidelines are [here](https://github.com/ossu/computer-science/blob/master/CURRICULAR_GUIDELINES.md). Successful critiques of the curriculum will point out ways that OSSU is failing to uphold these guidelines. Examples are: 8 | 9 | * OSSU lists a course as required when the course topics are elective in the curricular guide. 10 | * OSSU does not having a course to cover required topics from the curricular guide. 11 | * OSSU lists multiple courses that cover the same topics when fewer courses could suffice. 12 | * OSSU recommends a course to teach a topic, but there exists a higher quality course that covers the same material. 13 | ## Other ways to contribute 14 | ### Responding to Issues 15 | 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. 16 | ### Engaging with other students 17 | Learning is enhanced by engaged peers. You can be that peer for someone new to OSSU. When you see a new person posting in Gitter, 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. 18 | # Personal Customization 19 | If you want to customize the curriculum for yourself, you are encouraged to [fork this project](https://help.github.com/articles/fork-a-repo/)! 20 | -------------------------------------------------------------------------------- /CURRICULAR_GUIDELINES.md: -------------------------------------------------------------------------------- 1 | # Curricular Guidelines 2 | 3 | [Curriculum Guidelines for Undergraduate Programs in Computer Science](https://www.acm.org/binaries/content/assets/education/cs2013_web_final.pdf) 4 | 5 | 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. 6 | 7 | ## Organizations publishing: 8 | 9 | ### The Association for Computing Machinery 10 | 11 | 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. 12 | 13 | ### Institute of Electrical and Electronics Engineers 14 | 15 | 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. -------------------------------------------------------------------------------- /FAQ.md: -------------------------------------------------------------------------------- 1 | # Frequently Asked Questions 2 | 3 | This page answers some questions that we frequently receive about the curriculum. 4 | If you have questions that aren't answered here, try asking through one of our [community channels](README.md#community). 5 | If it seems important enough or we get asked that question a lot, we will probably add it here. 6 | 7 | Alternatively, you could [contribute](#CONTRIBUTING.md) an answer yourself. 8 | 9 | ## Contents 10 | 11 | - [Does OSSU offer a degree?](#does-ossu-offer-a-degree) 12 | - [How can I review the math prerequisites?](#how-can-i-review-the-math-prerequisites) 13 | - [What is a good course to learn a language (C++, Rust, Java, etc)?](#what-is-a-good-course-to-learn-a-particular-language) 14 | - [Why is the Firebase OSSU app different/broken?](#why-is-the-firebase-ossu-app-different-or-broken) 15 | - [In what order should I take the courses?](#in-what-order-should-i-take-the-courses) 16 | - [Does every resource in the main curriculum have to be free?](#does-every-resource-in-the-main-curriculum-have-to-be-free) 17 | - [Are Coursera courses free to access?](#are-coursera-courses-free-to-access) 18 | - [Is it necessary to purchase the Verified Upgrade for edX courses?](#is-it-necessary-to-purchase-the-verified-upgrade-for-edx-courses) 19 | - [What are the alt links?](#what-are-the-alt-links) 20 | - [Why doesn't the curriculum cover/ignore topic X?](#why-doesnt-the-curriculum-coverignore-topic-x) 21 | - [Why is the curriculum missing some pre-requisites?](#why-is-the-curriculum-missing-some-pre-requisites) 22 | - [Why require experience with a sizable project before the Software Engineering courses?](#why-require-experience-with-a-sizable-project-before-the-Software-Engineering-courses) 23 | - [How can I find a course on a particular subject?](#how-can-I-find-a-course-on-a-particular-subject) 24 | 25 | ## Questions 26 | 27 | ### Does OSSU offer a degree? 28 | 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. 29 | 30 | ### How can I review the math prerequisites? 31 | Many OSSU students choose to review math topics that they have not studied recently. 32 | OSSU recommends students use Khan Academy for such a review. 33 | Below are links to topic assessments. 34 | After taking an assessment, you should have a clear idea what topics to study, and resources on Khan Academy to use. 35 | 36 | - [Arithmetics](https://www.khanacademy.org/math/arithmetic#arithmetic-subject-challenge) 37 | - [Basic Geometry](https://www.khanacademy.org/math/basic-geo#basic-geo-subject-challenge) 38 | - [Pre-algebra](https://www.khanacademy.org/math/pre-algebra#pre-algebra-subject-challenge) 39 | - [High School Math 1](https://www.khanacademy.org/math/math1#math1-subject-challenge) 40 | - [High School Math 2](https://www.khanacademy.org/math/math2#math2-subject-challenge) 41 | - [High School Math 3](https://www.khanacademy.org/math/math3#math3-subject-challenge) 42 | 43 | (Math 1, 2, 3 covers all of algebra, pre-calculus, high school geometry, trig, stats. It interleaves the order of these topics.) 44 | 45 | ### What is a good course to learn a particular language? 46 | 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. 47 | 1. [Hackr.io](https://hackr.io/) allows users to submit and upvote learning resources for topics such as Python or the Java Spring Framework. 48 | 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. 49 | 50 | ### Why is the Firebase OSSU app different or broken? 51 | 52 | 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. 53 | 54 | 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. 55 | 56 | 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. 57 | 58 | ### In what order should I take the courses? 59 | 60 | You have a few different options: 61 | - You can progress linearly from top to bottom of the page. 62 | - You can progress linearly through each individual section, but studying different sections in parallel. 63 | - You can design your own custom progression using the pre-requisites to guide you. 64 | 65 | We have designed the curriculum to work for any of the above three styles. 66 | 67 | ### Does every resource in the main curriculum have to be free? 68 | 69 | Yes, that is a core goal of OSSU. 70 | 71 | At the same time, we recognize that education is a resource that requires payment to instructors to make it sustainable in the long term. 72 | 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. 73 | 74 | So we only require that the *learning materials* of a resource be free to access, not that every possible add-on be free. 75 | 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. 76 | 77 | ### Are Coursera courses free to access? 78 | 79 | Some courses that require payment to access probably do exist on Coursera, but we don't put those on our curriculum. 80 | All Coursera courses that we put on the curriculum must, at minimum, be **free to audit**. 81 | For some courses, all course features are available for free; 82 | for others (especially those that are part of a specialization), you may only be able to access the lecture videos. 83 | (If you find the policies have changed for any courses on our curriculum, please tell us!) 84 | 85 | Unfortunately, for some courses, Coursera's interface is [very aggressive](https://darkpatterns.org/) about convincing you that you have to pay. 86 | 87 | You may see something like this on the course page: 88 | 89 | Free Trial 90 | 91 | When attempting to enroll in such a course: 92 | - Click the blue "Enroll" or "Enroll Now" button. 93 | - A pop-up will appear. 94 | - **Do not click** "Start Free Trial", unless you do want to pay. 95 | - Find the text that says "Audit this course" at the bottom. 96 | - Click **Audit**. 97 | 98 | ![Audit this course](https://user-images.githubusercontent.com/3349406/27321369-95ca12e6-55cc-11e7-9b5c-f8fedd8fd643.png) 99 | 100 | ### Is it necessary to purchase the Verified Upgrade for edX courses? 101 | 102 | 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. 103 | 104 | ### What are the alt links? 105 | 106 | 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. 107 | 108 | ### Why doesn't the curriculum cover/ignore topic X? 109 | 110 | 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). 111 | 112 | ### Why is the curriculum missing some pre-requisites? 113 | 114 | The curriculum assumes two things: 115 | - You are reasonably fluent in English. 116 | - You have gotten through a standard high school curriculum that included physics and pre-calculus. 117 | 118 | Without these assumptions, the curriculum would be out of control with trying to fill in your knowledge gaps. 119 | For those who want to study math pre-requisites, read more [here](#how-can-i-review-the-math-prerequisites) 120 | 121 | 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! 122 | 123 | ### Why require experience with a sizable project before the Software Engineering courses? 124 | 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 a 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. 125 | 126 | ### How can I find a course on a particular subject? 127 | After completing Core CS, learners are ready to pursue computer science 128 | topics of their own interest. How can one find a course on a given topic? 129 | For MOOCs an excellent resource is [Class Central](https://www.classcentral.com/). 130 | For materials from university courses that are online (but not organized) 131 | into a MOOC, [awesome-courses](https://github.com/prakhar1989/awesome-courses) and 132 | [cs-video-courses](https://github.com/Developer-Y/cs-video-courses) 133 | are good resources. For textbooks, [Goodreads](https://www.goodreads.com/genres/computer-science) 134 | is a great platform for reader ratings and reviews. 135 | For learning a particular programming language or framework, 136 | [see this question](#what-is-a-good-course-to-learn-a-particular-language). 137 | -------------------------------------------------------------------------------- /HELP.md: -------------------------------------------------------------------------------- 1 | # Getting help 2 | ## Check the FAQ! 3 | Please check our [Frequently Asked Questions](FAQ.md) to see if your question has been addressed. 4 | ## Ask in the chat room 5 | [![Discord](https://img.shields.io/discord/744385009028431943.svg?label=&logo=discord&logoColor=ffffff&color=7389D8&labelColor=6A7EC2)](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. 6 | ### Specific problems 7 | 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**. 8 | ### General problems 9 | 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). 10 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015-2022 Open Source Society University 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /PROJECTS.md: -------------------------------------------------------------------------------- 1 | # Projects 2 | > Here, we are providing a list of projects done by the community for the final projects. You may use these as inspirations for your own final project! 3 | 4 | Projects created by OSSU's students for each course of our [**Computer Science**](https://github.com/ossu/computer-science) curriculum. 5 | 6 | For more project ideas, check the [Mega Project List](https://github.com/karan/Projects). 7 | 8 | - [Introduction to Computer Science](#introduction-to-computer-science) 9 | - [Programming](#programming) 10 | - [Math](#math) 11 | - [Systems](#systems) 12 | - [Theory](#theory) 13 | - [Applications](#application) 14 | 15 | ## Introduction to Computer Science 16 | Project Title | Description | Author(s) | Repository 17 | :-- | :-- | :--: | :-- 18 | StalkHub | Stalk Github beautifully | [Aman Roy](https://github.com/aman-roy) | [StalkHub](https://github.com/aman-roy/StalkHub) 19 | Webliza | ELIZA in python with web interface | [Vipin Kumar](https://github.com/VipinindKumar) | [Webliza](https://github.com/VipinindKumar/Webliza) 20 | 21 | 22 | ## Programming 23 | Project Title | Description | Author(s) | Repository 24 | :-- | :-- | :--: | :-- 25 | 26 | ## Math 27 | Project Title | Description | Author(s) | Repository 28 | :-- | :-- | :--: | :-- 29 | 30 | ## Systems 31 | Project Title | Description | Author(s) | Repository 32 | :-- | :-- | :--: | :-- 33 | 34 | ## Theory 35 | Project Title | Description | Author(s) | Repository 36 | :-- | :-- | :--: | :-- 37 | 38 | ## Application 39 | Project Title | Description | Author(s) | Repository 40 | :-- | :-- | :--: | :-- 41 | Observatory | Interactively displays temperatures and deviations all around the world from 1975 to 2015 | [spamegg](https://github.com/spamegg1) | [ScalaCapstone](https://github.com/spamegg1/ScalaCapstone) 42 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![Open Source Society University (OSSU)](https://i.imgur.com/kYYCXtC.png) 2 | 3 |

Open Source Society University

4 |

5 | Path to a free self-taught education in Computer Science! 6 |

7 |

8 | 9 | Awesome 10 | 11 | 12 | Open Source Society University - Computer Science 13 | 14 |

15 | 16 | # Contents 17 | 18 | - [Summary](#summary) 19 | - [Community](#community) 20 | - [Curriculum](#curriculum) 21 | - [Code of conduct](#code-of-conduct) 22 | - [Team](#team) 23 | 24 | # Summary 25 | 26 | The OSSU curriculum is a **complete education in computer science** using online materials. 27 | It's not merely for career training or professional development. 28 | It's for those who want a proper, *well-rounded* grounding in concepts fundamental to all computing disciplines, 29 | and for those who have the discipline, will, and (most importantly!) good habits to obtain this education largely on their own, 30 | but with support from a worldwide community of fellow learners. 31 | 32 | It is designed according to the degree requirements of undergraduate computer science majors, minus general education (non-CS) requirements, 33 | as it is assumed most of the people following this curriculum are already educated outside the field of CS. 34 | The courses themselves are among the very best in the world, often coming from Harvard, Princeton, MIT, etc., 35 | but specifically chosen to meet the following criteria. 36 | 37 | **Courses must**: 38 | - Be open for enrollment 39 | - Run regularly (ideally in self-paced format, otherwise running multiple times per year) 40 | - Be of generally high quality in teaching materials and pedagogical principles 41 | - Match the curricular standards of the [CS 2013](CURRICULAR_GUIDELINES.md): Curriculum Guidelines for Undergraduate Degree Programs in Computer Science 42 | 43 | When no course meets the above criteria, the coursework is supplemented with a book. 44 | When there are courses or books that don't fit into the curriculum but are otherwise of high quality, 45 | they belong in [extras/courses](extras/courses.md) or [extras/readings](extras/readings.md). 46 | 47 | **Organization**. The curriculum is designed as follows: 48 | - *Intro CS*: for students to try out CS and see if it's right for them 49 | - *Core CS*: corresponds roughly to the first three years of a computer science curriculum, taking classes that all majors would be required to take 50 | - *Advanced CS*: corresponds roughly to the final year of a computer science curriculum, taking electives according to the student's interests 51 | - *Final Project*: a project for students to validate, consolidate, and display their knowledge, to be evaluated by their peers worldwide 52 | 53 | **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 54 | ](https://docs.google.com/spreadsheets/d/1bkUU90y4rKYQHwY5AR2iX6iiPTrPEsYs75GkCAkrgm4/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. 55 | 56 | **Cost**. All or nearly all course material is available for free. However, some courses may charge money for assignments/tests/projects to be graded. 57 | 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. 58 | 59 | Decide how much or how little to spend based on your own time and budget; 60 | just remember that you can't purchase success! 61 | 62 | **Process**. Students can work through the curriculum alone or in groups, in order or out of order. 63 | - We recommend doing all courses in Core CS, only skipping a course when you are certain that you've already learned the material previously. 64 | - For simplicity, we recommend working through courses (especially Core CS) in order from top to bottom, as they have already been [topologically sorted](https://en.wikipedia.org/wiki/Topological_sorting) by their prerequisites. 65 | - 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, but we recommend getting validation from the community on the subject you choose. 66 | 67 | **Content policy**. If you plan on showing off some of your coursework publicly, you must share only files that you are allowed to. 68 | *Do NOT disrespect the code of conduct* that you signed in the beginning of each course! 69 | 70 | **[How to contribute](CONTRIBUTING.md)** 71 | 72 | **[Getting help](HELP.md)** (Details about our FAQ and chatroom) 73 | 74 | # Community 75 | 76 | - We have a discord server! [![Discord](https://img.shields.io/discord/744385009028431943.svg?label=&logo=discord&logoColor=ffffff&color=7389D8&labelColor=6A7EC2)](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) 77 | - 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). 78 | - Subscribe to our [newsletter](https://tinyletter.com/OpenSourceSocietyUniversity). 79 | - Add **Open Source Society University** to your [Linkedin](https://www.linkedin.com/school/11272443/) profile! 80 | - Note: There is an unmaintained and deprecated firebase app that you might find when searching OSSU. You can safely ignore it. Read more in the [FAQ](./FAQ.md#why-is-the-firebase-ossu-app-different-or-broken). 81 | 82 | # Curriculum 83 | 84 | **Curriculum version**: `8.0.0` (see [CHANGELOG](CHANGELOG.md)) 85 | 86 | - [Prerequisites](#prerequisites) 87 | - [Intro CS](#intro-cs) 88 | - [Introduction to Programming](#introduction-to-programming) 89 | - [Introduction to Computer Science](#introduction-to-computer-science) 90 | - [Core CS](#core-cs) 91 | - [Core programming](#core-programming) 92 | - [Core math](#core-math) 93 | - [CS Tools](#cs-tools) 94 | - [Core systems](#core-systems) 95 | - [Core theory](#core-theory) 96 | - [Core security](#core-security) 97 | - [Core applications](#core-applications) 98 | - [Core ethics](#core-ethics) 99 | - [Advanced CS](#advanced-cs) 100 | - [Advanced programming](#advanced-programming) 101 | - [Advanced systems](#advanced-systems) 102 | - [Advanced theory](#advanced-theory) 103 | - [Advanced information security](#advanced-information-security) 104 | - [Advanced math](#advanced-math) 105 | - [Final project](#final-project) 106 | 107 | --- 108 | 109 | ## Prerequisites 110 | 111 | - [Core CS](#core-cs) assumes the student has already taken [high school math](https://github.com/ossu/computer-science/blob/master/FAQ.md#how-can-i-review-the-math-prerequisites), including algebra, geometry, and pre-calculus. 112 | - [Advanced CS](#advanced-cs) assumes the student has already taken the entirety of Core CS 113 | and is knowledgeable enough now to decide which electives to take. 114 | - Note that [Advanced systems](#advanced-systems) assumes the student has taken a basic physics course (e.g. AP Physics in high school). 115 | 116 | ## Intro CS 117 | 118 | ### Introduction to Programming 119 | 120 | If you've never written a for-loop, or don't know what a string is in programming, start here. This course is self-paced, allowing you to adjust the number of hours you spend per week to meet your needs. 121 | 122 | **Topics covered**: 123 | `simple programs` 124 | `simple data structures` 125 | 126 | Courses | Duration | Effort | Prerequisites | Discussion 127 | :-- | :--: | :--: | :--: | :--: 128 | [Python for Everybody](https://www.py4e.com/lessons) | 10 weeks | 10 hours/week | none | [chat](https://discord.gg/syA242Z) 129 | 130 | ### Introduction to Computer Science 131 | 132 | This course will introduce you to the world of computer science. Students who have been introduced to programming, either from the courses above or through study elsewhere, should take this course for a flavor of the material to come. If you finish the course wanting more, Computer Science is likely for you! 133 | 134 | **Topics covered**: 135 | `computation` 136 | `imperative programming` 137 | `basic data structures and algorithms` 138 | `and more` 139 | 140 | Courses | Duration | Effort | Prerequisites | Discussion 141 | :-- | :--: | :--: | :--: | :--: 142 | [Introduction to Computer Science and Programming using Python](https://ocw.mit.edu/courses/6-0001-introduction-to-computer-science-and-programming-in-python-fall-2016/) ([alt](https://www.edx.org/course/introduction-to-computer-science-and-programming-7)) | 9 weeks | 15 hours/week | [high school algebra](https://www.khanacademy.org/math/algebra-home) | [chat](https://discord.gg/jvchSm9) 143 | 144 | ## Core CS 145 | 146 | All coursework under Core CS is **required**, unless otherwise indicated. 147 | 148 | ### Core programming 149 | **Topics covered**: 150 | `functional programming` 151 | `design for testing` 152 | `program requirements` 153 | `common design patterns` 154 | `unit testing` 155 | `object-oriented design` 156 | `static typing` 157 | `dynamic typing` 158 | `ML-family languages (via Standard ML)` 159 | `Lisp-family languages (via Racket)` 160 | `Ruby` 161 | `and more` 162 | 163 | The How to Code courses are based on the textbook [How to Design Programs](https://htdp.org/2003-09-26/). The First Edition is available for free online and includes problem sets and solutions. Students are encouraged to do these assignments. 164 | 165 | Courses | Duration | Effort | Prerequisites | Discussion 166 | :-- | :--: | :--: | :--: | :--: 167 | [How to Code - Simple Data](https://www.edx.org/course/how-to-code-simple-data) | 7 weeks | 8-10 hours/week | none | [chat](https://discord.gg/RfqAmGJ) 168 | [How to Code - Complex Data](https://www.edx.org/course/how-to-code-complex-data) | 6 weeks | 8-10 hours/week | How to Code: Simple Data | [chat](https://discord.gg/kczJzpm) 169 | [Programming Languages, Part A](https://www.coursera.org/learn/programming-languages) | 5 weeks | 4-8 hours/week | How to Code ([Hear instructor](https://www.coursera.org/lecture/programming-languages/recommended-background-k1yuh)) | [chat](https://discord.gg/8BkJtXN) 170 | [Programming Languages, Part B](https://www.coursera.org/learn/programming-languages-part-b) | 3 weeks | 4-8 hours/week | Programming Languages, Part A | [chat](https://discord.gg/EeA7VR9) 171 | [Programming Languages, Part C](https://www.coursera.org/learn/programming-languages-part-c) | 3 weeks | 4-8 hours/week | Programming Languages, Part B | [chat](https://discord.gg/8EZUVbA) 172 | [Object-Oriented Design](https://www.coursera.org/learn/object-oriented-design) | 4 weeks | 4 hours/week | [Basic Java](https://www.youtube.com/watch?v=GoXwIVyNvX0) 173 | [Design Patterns](https://www.coursera.org/learn/design-patterns) | 4 weeks | 4 hours/week | Object-Oriented Design 174 | [Software Architecture](https://www.coursera.org/learn/software-architecture) | 4 weeks | 2-5 hours/week | Design Patterns 175 | 176 | ### Core math 177 | 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. 178 | 179 | **Topics covered**: 180 | `discrete mathematics` 181 | `mathematical proofs` 182 | `basic statistics` 183 | `O-notation` 184 | `discrete probability` 185 | `and more` 186 | 187 | Courses | Duration | Effort | Notes | Prerequisites | Discussion 188 | :-- | :--: | :--: | :--: | :--: | :--: 189 | [Calculus 1A: Differentiation](https://openlearninglibrary.mit.edu/courses/course-v1:MITx+18.01.1x+2T2019/about) ([alt](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](FAQ.md#how-can-i-review-the-math-prerequisites) | [chat](https://discord.gg/mPCt45F) 190 | [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) 191 | [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) 192 | [Mathematics for Computer Science](https://openlearninglibrary.mit.edu/courses/course-v1:OCW+6.042J+2T2019/about) ([alt](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) 193 | 194 | 195 | ### CS Tools 196 | 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. 197 | 198 | **Topics covered**: 199 | `terminals and shell scripting` 200 | `vim` 201 | `command line environments` 202 | `version control` 203 | `and more` 204 | 205 | Courses | Duration | Effort | Prerequisites | Discussion 206 | :-- | :--: | :--: | :--: | :--: 207 | [The Missing Semester of Your CS Education](https://missing.csail.mit.edu/) | 2 weeks | 12 hours/week | - | [chat](https://discord.gg/5FvKycS) 208 | 209 | ### Core systems 210 | 211 | **Topics covered**: 212 | `procedural programming` 213 | `manual memory management` 214 | `boolean algebra` 215 | `gate logic` 216 | `memory` 217 | `computer architecture` 218 | `assembly` 219 | `machine language` 220 | `virtual machines` 221 | `high-level languages` 222 | `compilers` 223 | `operating systems` 224 | `network protocols` 225 | `and more` 226 | 227 | Courses | Duration | Effort | Additional Text / Assignments| Prerequisites | Discussion 228 | :-- | :--: | :--: | :--: | :--: | :--: 229 | [Build a Modern Computer from First Principles: From Nand to Tetris](https://www.coursera.org/learn/build-a-computer) ([alt](https://www.nand2tetris.org/)) | 6 weeks | 7-13 hours/week | - | C-like programming language | [chat](https://discord.gg/vxB2DRV) 230 | [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) 231 | [Operating Systems: Three Easy Pieces](coursepages/ostep/README.md) | 10-12 weeks | 6-10 hours/week | - | [strong C programming](/coursepages/ostep/README.md#prerequisites) | [chat](https://discord.gg/wZNgpep) 232 | [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) 233 | 234 | ### Core theory 235 | 236 | **Topics covered**: 237 | `divide and conquer` 238 | `sorting and searching` 239 | `randomized algorithms` 240 | `graph search` 241 | `shortest paths` 242 | `data structures` 243 | `greedy algorithms` 244 | `minimum spanning trees` 245 | `dynamic programming` 246 | `NP-completeness` 247 | `and more` 248 | 249 | Courses | Duration | Effort | Prerequisites | Discussion 250 | :-- | :--: | :--: | :--: | :--: 251 | [Divide and Conquer, Sorting and Searching, and Randomized Algorithms](https://www.coursera.org/learn/algorithms-divide-conquer) | 4 weeks | 4-8 hours/week | any programming language, Mathematics for Computer Science | [chat](https://discord.gg/mKRS7tY) 252 | [Graph Search, Shortest Paths, and Data Structures](https://www.coursera.org/learn/algorithms-graphs-data-structures) | 4 weeks | 4-8 hours/week | Divide and Conquer, Sorting and Searching, and Randomized Algorithms | [chat](https://discord.gg/Qstqe4t) 253 | [Greedy Algorithms, Minimum Spanning Trees, and Dynamic Programming](https://www.coursera.org/learn/algorithms-greedy) | 4 weeks | 4-8 hours/week | Graph Search, Shortest Paths, and Data Structures | [chat](https://discord.gg/dWVvjuz) 254 | [Shortest Paths Revisited, NP-Complete Problems and What To Do About Them](https://www.coursera.org/learn/algorithms-npcomplete) | 4 weeks | 4-8 hours/week | Greedy Algorithms, Minimum Spanning Trees, and Dynamic Programming | [chat](https://discord.gg/dYuY78u) 255 | 256 | ### Core security 257 | **Topics covered** 258 | `Confidentiality, Integrity, Availability` 259 | `Secure Design` 260 | `Defensive Programming` 261 | `Threats and Attacks` 262 | `Network Security` 263 | `Cryptography` 264 | `and more` 265 | 266 | Courses | Duration | Effort | Prerequisites | Discussion 267 | :-- | :--: | :--: | :--: | :--: 268 | [Cybersecurity Fundamentals](https://www.edx.org/course/cybersecurity-fundamentals) | 8 weeks | 10-12 hours/week | - | [chat](https://discord.gg/XdY3AwTFK4) 269 | [Principles of Secure Coding](https://www.coursera.org/learn/secure-coding-principles)| 4 weeks | 4 hours/week | - | [chat](https://discord.gg/5gMdeSK) 270 | [Identifying Security Vulnerabilities](https://www.coursera.org/learn/identifying-security-vulnerabilities) | 4 weeks | 4 hours/week | - | [chat](https://discord.gg/V78MjUS) 271 | 272 | Choose **one** of the following: 273 | 274 | Courses | Duration | Effort | Prerequisites | Discussion 275 | :-- | :--: | :--: | :--: | :--: 276 | [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) 277 | [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) 278 | 279 | ### Core applications 280 | 281 | **Topics covered**: 282 | `Agile methodology` 283 | `REST` 284 | `software specifications` 285 | `refactoring` 286 | `relational databases` 287 | `transaction processing` 288 | `data modeling` 289 | `neural networks` 290 | `supervised learning` 291 | `unsupervised learning` 292 | `OpenGL` 293 | `ray tracing` 294 | `and more` 295 | 296 | Courses | Duration | Effort | Prerequisites | Discussion 297 | :-- | :--: | :--: | :--: | :--: 298 | [Databases: Modeling and Theory](https://www.edx.org/course/modeling-and-theory)| 2 weeks | 10 hours/week | core programming | [chat](https://discord.gg/pMFqNf4) 299 | [Databases: Relational Databases and SQL](https://www.edx.org/course/databases-5-sql)| 2 weeks | 10 hours/week | core programming | [chat](https://discord.gg/P8SPPyF) 300 | [Databases: Semistructured Data](https://www.edx.org/course/semistructured-data)| 2 weeks | 10 hours/week | core programming | [chat](https://discord.gg/duCJ3GN) 301 | [Machine Learning](https://www.coursera.org/learn/machine-learning)| 11 weeks | 4-6 hours/week | linear algebra | [chat](https://discord.gg/NcXHDjy) 302 | [Computer Graphics](https://www.edx.org/course/computer-graphics-2)| 6 weeks | 12 hours/week | C++ or Java, linear algebra | [chat](https://discord.gg/68WqMNV) 303 | [Software Engineering: Introduction](https://www.edx.org/course/software-engineering-introduction) | 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) 304 | 305 | ### Core ethics 306 | 307 | **Topics covered**: 308 | `Social Context` 309 | `Analytical Tools` 310 | `Professional Ethics` 311 | `Intellectual Property` 312 | `Privacy and Civil Liberties` 313 | `and more` 314 | 315 | Courses | Duration | Effort | Prerequisites | Discussion 316 | :-- | :--: | :--: | :--: | :--: 317 | [Ethics, Technology and Engineering](https://www.coursera.org/learn/ethics-technology-engineering)| 9 weeks | 2 hours/week | none | [chat](https://discord.gg/6ttjPmzZbe) 318 | [Introduction to Intellectual Property](https://www.coursera.org/learn/introduction-intellectual-property)| 4 weeks | 2 hours/week | none | [chat](https://discord.gg/YbuERswpAK) 319 | [Data Privacy Fundamentals](https://www.coursera.org/learn/northeastern-data-privacy)| 3 weeks | 3 hours/week | none | [chat](https://discord.gg/64J34ajNBd) 320 | 321 | ## Advanced CS 322 | 323 | After completing **every required course** in Core CS, students should choose a subset of courses from Advanced CS based on interest. 324 | Not every course from a subcategory needs to be taken. 325 | But students should take *every* course that is relevant to the field they intend to go into. 326 | 327 | ### Advanced programming 328 | 329 | **Topics covered**: 330 | `debugging theory and practice` 331 | `goal-oriented programming` 332 | `parallel computing` 333 | `object-oriented analysis and design` 334 | `UML` 335 | `large-scale software architecture and design` 336 | `and more` 337 | 338 | Courses | Duration | Effort | Prerequisites 339 | :-- | :--: | :--: | :--: 340 | [Parallel Programming](https://www.coursera.org/learn/scala-parallel-programming)| 4 weeks | 6-8 hours/week | Scala programming 341 | [Compilers](https://www.edx.org/course/compilers) | 9 weeks | 6-8 hours/week | none 342 | [Introduction to Haskell](https://www.seas.upenn.edu/~cis194/fall16/)| 14 weeks | - | - 343 | [Learn Prolog Now!](https://www.let.rug.nl/bos/lpn//lpnpage.php?pageid=online) ([alt](https://github.com/ossu/computer-science/files/6085884/lpn.pdf))*| 12 weeks | - | - 344 | [Software Debugging](https://www.udacity.com/course/software-debugging--cs259)| 8 weeks | 6 hours/week | Python, object-oriented programming 345 | [Software Testing](https://www.udacity.com/course/software-testing--cs258) | 4 weeks | 6 hours/week | Python, programming experience 346 | 347 | (*) 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/)) 348 | 349 | ### Advanced systems 350 | 351 | **Topics covered**: 352 | `digital signaling` 353 | `combinational logic` 354 | `CMOS technologies` 355 | `sequential logic` 356 | `finite state machines` 357 | `processor instruction sets` 358 | `caches` 359 | `pipelining` 360 | `virtualization` 361 | `parallel processing` 362 | `virtual memory` 363 | `synchronization primitives` 364 | `system call interface` 365 | `and more` 366 | 367 | Courses | Duration | Effort | Prerequisites | Notes 368 | :-- | :--: | :--: | :--: | :--: 369 | [Computation Structures 1: Digital Circuits](https://learning.edx.org/course/course-v1:MITx+6.004.1x_3+3T2016) [alt1](https://ocw.mit.edu/courses/6-004-computation-structures-spring-2017/) [alt2 ](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. 370 | [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 | 371 | [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 | 372 | 373 | ### Advanced theory 374 | 375 | **Topics covered**: 376 | `formal languages` 377 | `Turing machines` 378 | `computability` 379 | `event-driven concurrency` 380 | `automata` 381 | `distributed shared memory` 382 | `consensus algorithms` 383 | `state machine replication` 384 | `computational geometry theory` 385 | `propositional logic` 386 | `relational logic` 387 | `Herbrand logic` 388 | `game trees` 389 | `and more` 390 | 391 | Courses | Duration | Effort | Prerequisites 392 | :-- | :--: | :--: | :--: 393 | [Theory of Computation](http://aduni.org/courses/theory/index.php?view=cw) ([Lectures](https://www.youtube.com/playlist?list=PLTke5lHMAdSNmi57H0DOTzClHPK6UwSTN)) | 8 weeks | 10 hours/week | discrete mathematics, logic, algorithms 394 | [Computational Geometry](https://www.edx.org/course/computational-geometry) | 16 weeks | 8 hours/week | algorithms, C++ 395 | [Game Theory](https://www.coursera.org/learn/game-theory-1) | 8 weeks | 3 hours/week | mathematical thinking, probability, calculus 396 | 397 | ### Advanced Information Security 398 | 399 | Courses | Duration | Effort | Prerequisites 400 | :-- | :--: | :--: | :--: 401 | [Web Security Fundamentals](https://www.edx.org/course/web-security-fundamentals) | 5 weeks | 4-6 hours/week | understanding basic web technologies 402 | [Security Governance & Compliance](https://www.coursera.org/learn/security-governance-compliance) | 3 weeks | 3 hours/week | - 403 | [Digital Forensics Concepts](https://www.coursera.org/learn/digital-forensics-concepts) | 3 weeks | 2-3 hours/week | Core Security 404 | [Secure Software Development: Requirements, Design, and Reuse](https://www.edx.org/course/secure-software-development-requirements-design-and-reuse) | 7 weeks | 1-2 hours/week | Core Programming and Core Security 405 | [Secure Software Development: Implementation](https://www.edx.org/course/secure-software-development-implementation) | 7 weeks | 1-2 hours/week | Secure Software Development: Requirements, Design, and Reuse 406 | [Secure Software Development: Verification and More Specialized Topics](https://www.edx.org/course/secure-software-development-verification-and-more-specialized-topics) | 7 weeks | 1-2 hours/week | Secure Software Development: Implementation 407 | 408 | ### Advanced math 409 | Courses | Duration | Effort | Prerequisites | Discussion 410 | :-- | :--: | :--: | :--: | :--: 411 | [Essence of Linear Algebra](https://www.youtube.com/playlist?list=PLZHQObOWTQDPD3MizzM2xVFitgF8hE_ab) | - | - | [high school math](FAQ.md#how-can-i-review-the-math-prerequisites) | [chat](https://discord.gg/m6wHbP6) 412 | [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) 413 | [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) 414 | [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) 415 | [Probability](https://projects.iq.harvard.edu/stat110/home) | 24 weeks | 12 hours/week | [Differentiation and Integration](https://www.edx.org/course/calculus-1b-integration) | [chat](https://discord.gg/UVjs9BU) 416 | 417 | ## Final project 418 | 419 | OSS University is project-focused. 420 | The assignments and exams for each course are to prepare you to use your knowledge to solve real-world problems. 421 | 422 | After you've gotten through all of Core CS and the parts of Advanced CS relevant to you, you should think about a problem that you can solve using the knowledge you've acquired. 423 | Not only does real project work look great on a resume, but the project will also validate and consolidate your knowledge. 424 | You can create something entirely new, or you can find an existing project that needs help via websites like 425 | [CodeTriage](https://www.codetriage.com/) 426 | or 427 | [First Timers Only](https://www.firsttimersonly.com/). 428 | 429 | 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): 430 | 431 | Courses | Duration | Effort | Prerequisites 432 | :-- | :--: | :--: | :--: 433 | [Fullstack Open](https://fullstackopen.com/en/) | 12 weeks | 15 hours/week | programming 434 | [Modern Robotics (Specialization)](https://www.coursera.org/specializations/modernrobotics) | 26 weeks | 2-5 hours/week | freshman-level physics, linear algebra, calculus, [linear ordinary differential equations](https://www.khanacademy.org/math/differential-equations) 435 | [Data Mining (Specialization)](https://www.coursera.org/specializations/data-mining) | 30 weeks | 2-5 hours/week | machine learning 436 | [Big Data (Specialization)](https://www.coursera.org/specializations/big-data) | 30 weeks | 3-5 hours/week | none 437 | [Internet of Things (Specialization)](https://www.coursera.org/specializations/internet-of-things) | 30 weeks | 1-5 hours/week | strong programming 438 | [Cloud Computing (Specialization)](https://www.coursera.org/specializations/cloud-computing) | 30 weeks | 2-6 hours/week | C++ programming 439 | [Data Science (Specialization)](https://www.coursera.org/specializations/jhu-data-science) | 43 weeks | 1-6 hours/week | none 440 | [Functional Programming in Scala (Specialization)](https://www.coursera.org/specializations/scala) | 29 weeks | 4-5 hours/week | One year programming experience 441 | [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 442 | 443 | ### Evaluation 444 | 445 | Upon completing your final project: 446 | - Submit your project's information to [PROJECTS](PROJECTS.md) via a pull request. 447 | - Put the OSSU-CS badge in the README of your repository! 448 | [![Open Source Society University - Computer Science](https://img.shields.io/badge/OSSU-computer--science-blue.svg)](https://github.com/ossu/computer-science) 449 | 450 | - Markdown: `[![Open Source Society University - Computer Science](https://img.shields.io/badge/OSSU-computer--science-blue.svg)](https://github.com/ossu/computer-science)` 451 | - HTML: `Open Source Society University - Computer Science` 452 | - Use our [community](#community) channels to announce it to your fellow students. 453 | 454 | Solicit feedback from your OSSU peers. 455 | You will not be "graded" in the traditional sense — everyone has their own measurements for what they consider a success. 456 | The purpose of the evaluation is to act as your first announcement to the world that you are a computer scientist 457 | and to get experience listening to feedback — both positive and negative. 458 | 459 | The final project evaluation has a second purpose: to evaluate whether OSSU, 460 | through its community and curriculum, is successful in its mission to guide independent learners in obtaining a world-class computer science education. 461 | 462 | ### Cooperative work 463 | 464 | You can create this project alone or with other students! 465 | **We love cooperative work**! 466 | Use our [channels](#community) to communicate with other fellows to combine and create new projects! 467 | 468 | ### Which programming languages should I use? 469 | 470 | My friend, here is the best part of liberty! 471 | You can use **any** language that you want to complete the final project. 472 | 473 | The important thing is to **internalize** the core concepts and to be able to use them with whatever tool (programming language) that you wish. 474 | 475 | ## Congratulations 476 | 477 | After completing the requirements of the curriculum above, you will have completed the equivalent of a full bachelor's degree in Computer Science. Congratulations! 478 | 479 | What is next for you? The possibilities are boundless and overlapping: 480 | 481 | - Look for a job as a developer! 482 | - Check out the [readings](extras/readings.md) for classic books you can read that will sharpen your skills and expand your knowledge. 483 | - Join a local developer meetup (e.g. via [meetup.com](https://www.meetup.com/)). 484 | - Pay attention to emerging technologies in the world of software development: 485 | + 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! 486 | + Explore **borrowing and lifetimes** through [Rust](https://www.rust-lang.org/), a systems language which achieves memory- and thread-safety without a garbage collector! 487 | + Explore **dependent type systems** through [Idris](https://www.idris-lang.org/), a new Haskell-inspired language with unprecedented support for type-driven development. 488 | 489 | ![keep learning](https://i.imgur.com/REQK0VU.jpg) 490 | 491 | # Code of conduct 492 | [OSSU's code of conduct](https://github.com/ossu/code-of-conduct). 493 | 494 | ## How to show your progress 495 | 496 | 1. Create an account in [Trello](https://trello.com/). 497 | 1. Copy [this](https://trello.com/b/IScNSzsI/ossu-compsci) board to your personal account. 498 | See how to copy a board [here](https://help.trello.com/article/802-copying-cards-lists-or-boards). 499 | 500 | Now that you have a copy of our official board, you just need to pass the cards to the `Doing` column or `Done` column as you progress in your study. 501 | 502 | We also have **labels** to help you have more control through the process. 503 | The meaning of each of these labels is: 504 | 505 | - `Main Curriculum`: cards with that label represent courses that are listed in our curriculum. 506 | - `Extra Resources`: cards with that label represent courses that were added by the student. 507 | - `Doing`: cards with that label represent courses the student is currently doing. 508 | - `Done`: cards with that label represent courses finished by the student. 509 | Those cards should also have the link for at least one project/article built with the knowledge acquired in such a course. 510 | - `Section`: cards with that label represent the section that we have in our curriculum. 511 | Those cards with the `Section` label are only to help the organization of the Done column. 512 | You should put the *Course's cards* below its respective *Section's card*. 513 | 514 | The intention of this board is to provide our students a way to track their progress, and also the ability to show their progress through a public page for friends, family, employers, etc. 515 | You can change the status of your board to be *public* or *private*. 516 | 517 | # Team 518 | 519 | * **[Eric Douglas](https://github.com/ericdouglas)**: founder of OSSU 520 | * **[Josh Hanson](https://github.com/joshmhanson)**: lead technical maintainer 521 | * **[Waciuma Wanjohi](https://github.com/waciumawanjohi)**: lead academic maintainer 522 | * **[Contributors](https://github.com/ossu/computer-science/graphs/contributors)** 523 | -------------------------------------------------------------------------------- /coursepages/ostep/Project-1B-initial-xv6.md: -------------------------------------------------------------------------------- 1 | ## Project 1B 2 | 3 | ### all thanks to [palladian](https://github.com/palladian1) 4 | 5 | ### Linux Installation 6 | 7 | * Make sure you have a compatible compiler toolchain; if you're on Linux, gcc should work perfectly. 8 | * Install qemu-system-x86 (may be called qemu-system-i386 or qemu-system-x86_64; note that on some distros, qemu is the wrong package). 9 | * Install Perl. 10 | * Install gawk. 11 | * Install expect. 12 | * Make a src/ directory in the same directory as the project's test script. 13 | * Clone xv6 github repo and copy the source code in to your src/ directory. 14 | * Inside src/, run `make qemu-nox` to test whether xv6 is working. Exit xv6 with `Ctrl-a x`; if you forget this, you can also kill the qemu process. It's worth checking `top` or `htop` to make sure qemu isn't running anymore; sometimes it can keep going after you exit and consume a lot of resources. 15 | * Modify the Makefile to set `CPUS := 1`. 16 | * Run `make qemu-nox` again to test that xv6 still works. 17 | 18 | ### Instructions 19 | 20 | * Your task is to create a new system call for xv6, `getreadcount()`, that will return the number of `read` syscalls that have previously taken place. Note that the count should be a global count, not a per-process count. 21 | 22 | ### Suggested Approach 23 | 24 | * Download the xv6 source code PDF (it's better organized there than in the code you downloaded). Read the table of contents to understand how sheets, pages, and lines are numbered. Then glance at the cross-references after that so you know how to find parts of the code if you need to. 25 | * Take a (very) quick look at the portions of the xv6 source code listed under `processes` and `system calls` on the table of contents, as well as `usys.S` in the `user-level` section. Don't worry about understanding it yet; you just need to see where each file is in the PDF so that you can follow along with the discussion video later, since the professor's code has a different directory layout than yours will. 26 | * Watch the video for discussion 2 on Project P1B, and follow along with your PDF copy of the xv6 code. Annotate it as the professor explains what each part does. 27 | * Read the background section linked on the project's Github page, annotating the xv6 code PDF. 28 | * Read through the xv6 PDF one more time, this time to get a general understanding of the `processes` and `system calls` sections, as well as `usys.S` and `user.h` (NOTE: the last one isn't included in the xv6 PDF, so you'll have to look at the actual code you downloaded). Don't worry about understanding every last line of code, just make sure you know where system calls are defined, how they're called, etc. 29 | * Modify the xv6 source code to add the new `getreadcount()` syscall. You will need to modify several files; I suggest marking your modifications with `// OSTEP project` to make it easy to find them later for debugging. 30 | * There is one other place you'll have to add code, which isn't included in the xv6 PDF: `user.h`. 31 | * Once you're done, run the test script. Test 1 runs a function that will make several `read` calls, then calls `getreadcount`. In order for your code to work, you must correctly keep track of the total number of `read` calls made by all processes. 32 | * If your code passes test 1, congratulations! You're done for now. Don't worry about test 2 until after you've watched the lectures on concurrency. 33 | * If your code didn't pass test 1, you can compare the expected output in `tests/1.out` with your test's actual output in `tests-out/1.out`. You can also look at `tests-out/1.err` to check for any error messages. 34 | * You can also test your code by loading up xv6 in your terminal with `make qemu-nox`. Type `ls` to see all files; you should see `test_1` and `test_2`. Run test 1 with `./test_1` to see what it prints out; you can compare that manually with the expected output. 35 | * Once you've watched the lectures on threads, concurrency, and locks: test 2 checks whether your implementation of `getreadcount` is thread-safe. It probably wasn't before, so in order to fix that, you'll have to add a lock. Then you can run the test script again and check that your code now passes both tests. 36 | -------------------------------------------------------------------------------- /coursepages/ostep/Project-2A-processes-shell.md: -------------------------------------------------------------------------------- 1 | ## Project 2A 2 | ### all thanks to [Palladian](https://github.com/palladian1/) 3 | 4 | - [x] Interactive mode 5 | - [x] Batch mode 6 | - [x] exit 7 | - [x] cd 8 | - [x] path 9 | - [x] Redirection 10 | - [x] Parallel commands 11 | 12 | ### Tips 13 | 14 | * Watch the video for discussion 3 on the Unix shell. 15 | * Read chapter 5 in the OSTEP book. 16 | * Start by implementing a shell that only does one thing: prints the prompt, then exits when you type `exit`. Then add `cd`, then `path`. Then implement the ability to execute commands with `execv`, then add batch mode, then redirection, and finally parallel commands. 17 | * All of the test scripts will use batch mode and redirection, so until you've got those done, you'll have to test your shell manually. 18 | * When you implement the `path` command, make sure you can handle both absolute and relative paths (i.e., `path tests` as well as `path /usr/bin`. 19 | * It's tricky to get the errors down right, so just add error messages wherever it seems reasonable, then run the test scripts and modify your code until you're reporting errors exactly when you're supposed to. If you're running test `i`, you can check `tests/i.err` and `tests/i.rc` to see how many errors your shell should generate and compare to `tests-out/i.err` and `tests-out/i.rc`. 20 | * If you run into issues with test 3 where the test expects something like `ls: cannot access ...` and your shell ouputs `/bin/ls: cannot access ...` or `/usr/bin/ls: cannot access ...`, try modifying your $PATH environment variable to start with `/bin`. If that doesn't work, just modify `tests/3.err` to match the output your system gives. You can't modify your system's output without messing with the implementation of `ls` and/or `execv`, so it's okay to skip this test as long as it's working in spirit. 21 | * I had to edit `/tests/3.pre` to use `/bin/ls` due to how it's set up on my system, in order to pass all the tests. Alternatively you can add `export PATH="/bin:$PATH"` to your `.profile` or `.bashrc` file. 22 | 23 | ### Memory Management Traps and Pitfalls 24 | 25 | * This assignment makes it really easy to create pointers to stack variables that will no longer exist once they're out of scope, thus causing a segmentation fault. Make sure that if you set a pointer to point to a string, that string is something you allocated on the heap, and not on the stack. 26 | 27 | * That said, if you do use a string on the stack, you can copy it into a heap-allocated string using `strcpy()`, `strncpy()`, `strcat()`, and `strncat()`. 28 | 29 | * Only use `strcpy()` and `strcat()` for fixed-size strings and make sure the buffer you're copying into has enough space to hold the string, plus an extra character for `\0`. 30 | 31 | * For `strncpy()` and `strncat()`, make sure `n` is large enough to fit the `\0` terminator, or add it manually. 32 | 33 | * Watch out for use-after-frees, especially in the implementation of `path`. 34 | 35 | * Make sure you free any strings from `getline()` and `strdup()`, but watch out for double-frees, e.g. don't free a substring of a string you already freed. 36 | 37 | * Avoid the C library function `strtok()`; it's not thread-safe. Use `strsep()` instead. 38 | 39 | * When you use `strsep()`, make sure you keep a copy of the original pointer to the string around so that you can free it later, because `strsep()` will modify the pointer, so if you free that later on, you'll corrupt the page table. 40 | 41 | * After calling `strsep(&buf, delim)`, check whether `buf` is `NULL` before dereferencing it. 42 | * General C coding practice: if you allocate memory for a data structure inside a function, you should free it in the same function. If you allocate memory in a dedicated `create_xxx` function, you should have a corresponding `destroy_xxx` function. That way, you always allocate and free memory at the same function depth, which makes it easier to avoid memory errors. 43 | * After every call to `malloc`, `calloc`, or `realloc`, check whether the result is `NULL`. 44 | * Use `calloc` instead of `malloc` if you're creating an array of pointers to avoid creating pointers to garbage values. 45 | * in `update_path` I had to fix that issue where most of the tests do `path /bin /usr/bin`, but one of them did `path tests`. So i just assumed that if your path starts with a slash, it's an absolute path and you should copy it in as is; if it doesn't, it's a relative path and you should add a ./ at the beginning. 46 | -------------------------------------------------------------------------------- /coursepages/ostep/README.md: -------------------------------------------------------------------------------- 1 | # Operating Systems: Three Easy Pieces 2 | 3 | Credit goes to [palladian](https://github.com/palladian1) 4 | ## Introduction 5 | 6 | First, we should be frank: it's really hard to find a good self-contained online course on operating systems. OSTEP is the best course we've found so far, but it does have some issues. 7 | 8 | This is the first course in the OSSU curriculum for which you'll need to learn some prerequisites on your own before starting it, in addition to the courses that come before it in the curriculum. You might also run into some issues running the scripts for homework demos and for testing your solutions to the projects (although we hope we've solved most of those by now). 9 | 10 | What this means for you is that if you're under a significant time crunch, or you're just not all that interested in systems programming and OS development, there's no shame in skipping this course and coming back to it later. You could also do only a part of the course (e.g. you might choose to skip the homework and/or projects). 11 | 12 | That said, if you're able to commit the time required for the prerequisites, we believe the reward is well worth the effort: this course is exciting, interesting, and quite useful for other fields of computer science and programming. One big attraction of this course is the opportunity to see a simplified but fully-functional Unix-like operating system in action and understand the concepts and design decisions that went into it as well as the low-level implementation details. 13 | 14 | In order to satisfy OSSU's curricular guidelines, you should either watch all the lecture videos or read chapters 1 through 47 in the textbook (don't worry, the chapters are usually just a few pages long) as well as finish the projects listed below. We also strongly encourage you to do the homework exercises as they're assigned on the course website or in the book chapters; think of these like the "check-your-understanding" questions that pop up in the middle of lecture videos on sites like Coursera or edX. 15 | 16 | ## Prerequisites 17 | 18 | This class requires a lot of experience programming in C. You should finish one of the C books listed in the [resources below](#c) *before* starting this course; if you try to learn C at the same time as the course material, you're likely to feel overwhelmed. If you haven't used C before, you should expect to spend a lot of time on this; it's hard to predict how long it might take for each person, but a rough estimate might be 8-10 hours per week for 3-5 weeks. You can always learn C alongside another OSSU course or even redo the exercises for other courses in C to gain practice with it. 19 | 20 | You should also finish both parts of Nand2Tetris before starting this course. OSTEP focuses on the real-world x86 and x86_64 architectures, so you'll have to fill in some gaps in order to translate the concepts you learned in Nand2Tetris to a new architecture. You can do that with the x86 resources below, but note that they all assume you know C, so learn that first. This should take around 6-8 hours in total. 21 | 22 | ## Course Links 23 | 24 | * [Course website](https://pages.cs.wisc.edu/~remzi/Classes/537/Spring2018/) 25 | * [Book](https://pages.cs.wisc.edu/~remzi/OSTEP/) 26 | * [Lecture videos](https://pages.cs.wisc.edu/~remzi/Classes/537/Spring2018/Discussion/videos.html) 27 | * [Homework](https://pages.cs.wisc.edu/~remzi/OSTEP/Homework/homework.html) 28 | * [Homework repo](https://github.com/remzi-arpacidusseau/ostep-homework) 29 | * [Projects](https://github.com/remzi-arpacidusseau/ostep-projects) 30 | * [xv6](https://github.com/mit-pdos/xv6-public) 31 | 32 | ## Roadmap 33 | 34 | This course was originally taught as CS 537 at the University of Wisconsin by the author of the OSTEP textbook, so the projects are assigned in the course according to the best times to give UWisconsin students access to on-campus resources like recitation sections and office hours. That means they don't match up perfectly with the material being covered at that time in the lectures or textbook chapters. We recommend doing the course in the following order instead. 35 | 36 | [Reading order](Reading-order.md) 37 | 38 | * Read chapters 1 and 2 of the OSTEP textbook and watch the first half (the introduction) of lecture 1. 39 | * Do the `initial-utilities` project; it's intended as a litmus test for you to make sure you're comfortable enough with C before taking this class. You can watch discussion 1 for help. If it takes you more than 2 hours to write the code (not counting the discussion time and any time spent debugging), you should consider spending more time learning C before moving on in the course. (If you want more practice, you can do `initial-reverse` too, but it's not required.) 40 | * Watch lectures 1 through 5 and read chapters 3 through 24 of the OSTEP textbook. We recommend doing the homework assignments as they come up in the course calendar or book chapters. 41 | * Watch discussion 3 and reread chapter 5, then do the `processes-shell` project. 42 | * Read the annotated guide to xv6 linked in the resources section below, starting from the beginning and stopping after the `System Calls: Processes` section. 43 | * Watch discussion 2, then do the `initial-xv6` project. 44 | * Watch discussion 5, then do the `scheduling-xv6-lottery` project. 45 | * Watch discussion 7, then do the `vm-xv6-intro` project. 46 | * Watch lectures 6 through 9 (and optionally, the review lecture) and read chapters 25 through 34; again, you're encouraged to do the homework. 47 | * Watch discussion 10, then do the `concurency-xv6-threads` project. 48 | * Watch discussions 11 and 12, then do the `concurrency-mapreduce` project. 49 | * Watch lectures 10 through 14 (and optionally, the second review lecture) and read chapters 35 through 47; remember to do the homework along with the lectures or chapters. 50 | * Do the `filesystems-checker` project. 51 | 52 | ### Running the Projects 53 | 54 | This course was originally taught as CS 537 at the University of Wisconsin by the author of the OSTEP textbook, which means that the homework and projects were written with those students as a target audience and designed to be run on UWisconsin lab computers with specific software versions pre-installed for students. We hope this section fixes that so you can run them on other computers, but we haven't tested this on every computer, so if you run into other issues, let us know on the [Discord channel](https://discord.gg/MJ9YXyV) and we'll try to help out. 55 | 56 | In order to run the homework and projects on Linux or macOS, you'll need to have all of the following programs installed: 57 | 58 | * `gcc` 59 | * `gas` 60 | * `ld` 61 | * `gdb` 62 | * `make` 63 | * `objcopy` 64 | * `objdump` 65 | * `dd` 66 | * `python` 67 | * `perl` 68 | * `gawk` 69 | * `expect` 70 | * `git` 71 | 72 | You will also need to install `qemu`, but we recommend using the patched version provided by the xv6 authors; see [this link](https://pdos.csail.mit.edu/6.828/2018/tools.html) for details. 73 | 74 | On macOS, you'll need to install a cross-compiler `gcc` suite capable of producing x86 ELF binaries; see the link above for details as well. 75 | 76 | On Windows, you can use a Linux virtual machine for the homework and projects. Some of these packages are not yet supported on Apple M1 computers, and virtual machine software has not yet been ported to the new processor architecture; some students have used a VPS to do the homework and projects instead. 77 | 78 | Next, clone the `ostep-homework` and `ostep-projects` repositories: 79 | ```sh 80 | git clone https://github.com/remzi-arpacidusseau/ostep-homework/ 81 | git clone https://github.com/remzi-arpacidusseau/ostep-projects/ 82 | cd ostep-projects 83 | ``` 84 | 85 | You'll have to clone [the `xv6-public` repository](https://github.com/mit-pdos/xv6-public) into the directory for each xv6-related OSTEP project. You could use the same copy for all the projects, but we recommend using separate copies to avoid previous projects causing bugs for later ones. Run the following commands in *each* of the `initial-xv6`, `scheduling-xv6-lottery`, `vm-xv6-intro`, `concurrency-xv6-threads`, and `filesystems-checker` directories. 86 | 87 | ```sh 88 | mkdir src 89 | git clone https://github.com/mit-pdos/xv6-public src 90 | ``` 91 | 92 | ### Hints and tips for Projects 93 | 94 | - `initial-reverse`: the error messages that are needed to pass the tests were wrong! The provided text said `"error: ..."` but the tests expected `"reverse: ..."` so make sure to match the tests' expectations in your code. 95 | - [hints and tips for `processes-shell`](Project-2A-processes-shell.md) 96 | - [hints for Project 1B: `initial-xv6`](Project-1B-initial-xv6.md) 97 | - [hints for `scheduling-xv6-lottery`](Scheduling-xv6-lottery.md) 98 | - [hints for `vm-xv6-intro`](vm-xv6-intro.md) 99 | 100 | 101 | ## Resources 102 | 103 | ### C 104 | 105 | Please don't try to learn C from sites like GeeksforGeeks, TutorialsPoint, or Hackr.io (we're not even gonna link to them here). Those are great resources for other languages, but C has way too many pitfalls, and C tutorials online are often filled with dangerous errors and bad coding practices. We looked at many C resources for the recommendations below and unfortunately found *many* bad or unsafe ones; we'll only include the best ones here, so look no further! 106 | 107 | We recommend learning C by working through (the entirety of) Jens Gustedt's *Modern C*, which is [freely available online](https://hal.inria.fr/hal-02383654/file/ModernC.pdf). This book is relatively short and will bring you up to speed on the C language itself as well as modern coding practices for it. Make sure to do all the exercises in the footnotes! 108 | 109 | While the book above is our default recommendation, we also recommend K.N. King's [*C Programming: A Modern Approach*](http://www.knking.com/books/c2/) as a second, more beginner-friendly option. It has some disadvantages: it's much longer (almost 850 pages), it's not available for free (and copies can be hard to find), and it's not quite as recent as *Modern C* (but still relevant nonetheless). That said, it has more exercises if you want extra practice, and the Q&A sections at the end of each chapter are filled with pearls of C wisdom and answers to C FAQs. It also covers almost the entirety of the C language and standard library, so it doubles as a reference book. 110 | 111 | CS 50 doesn't quite cover enough C for OSTEP, but if you've already taken CS 50, you can supplement it with the books above. 112 | 113 | Additional (***optional***) resources include: 114 | * [CS 50 Manual Pages](https://manual.cs50.io): a great reference for looking up C library functions; most functions include both the usual manual as well as a beginner-friendly "less comfortable" option (just note that the "less comfortable" version uses `string` as an alias for `char *`.) 115 | * [cdecl](https://cdecl.org): a tool to translate C gibberish into English. 116 | * [C track on exercism.org](https://exercism.org/tracks/C): additional practice exercises. 117 | * [Secure Coding Practices in C and C++](https://www.amazon.com/dp/0321822137): if you want to understand why other C resources are so unsafe. 118 | * [*The C Programming Language*](https://www.amazon.com/dp/0131103628): the original book on C by its creators. Too outdated for OSTEP, but a good read if you manage to find a copy. 119 | 120 | ### x86 Architecture and Assembly Language 121 | 122 | Nand2Tetris has already introduced most of the concepts you'll need to understand systems and computer architectures, so now you just need to port that knowledge to the real-world (32-bit) x86 architecture. 123 | 124 | The easiest way to do that is by watching a subset of the lectures from the *Computer Systems: A Programmer's Perspective* course (or reading the matching chapters in the [textbook](https://www.amazon.com/dp/013409266X) of the same name). The lectures you'll need are: 125 | 126 | * [Machine-Level Programming I: Basics](https://scs.hosted.panopto.com/Panopto/Pages/Viewer.aspx?id=6e410255-3858-4e85-89c7-812c5845d197) 127 | * [Machine-Level Programming II: Control](https://scs.hosted.panopto.com/Panopto/Pages/Viewer.aspx?id=fc93c499-8fc9-4652-9a99-711058054afb) 128 | * [Machine-Level Programming III: Procedures](https://scs.hosted.panopto.com/Panopto/Pages/Viewer.aspx?id=2994255f-923b-4ad4-8fb4-5def7fd802cd) 129 | * [Machine-Level Programming IV: Data](https://scs.hosted.panopto.com/Panopto/Pages/Viewer.aspx?id=03308c94-fc20-40d8-8978-1a9b81c344ed) 130 | * [Machine-Level Programming V: Advanced Topics](https://scs.hosted.panopto.com/Panopto/Pages/Viewer.aspx?id=3f0bf9ca-d640-4798-b91a-73aed656a10a) 131 | * [Linking](https://scs.hosted.panopto.com/Panopto/Pages/Viewer.aspx?id=0aef84fc-a53b-49c6-bb43-14cb2b175249) 132 | 133 | Additional (***optional***) resources include: 134 | * [CPU Registers x86](https://wiki.osdev.org/CPU_Registers_x86): good for looking up specific registers. 135 | * [*PC Assembly Language*](https://pdos.csail.mit.edu/6.828/2018/readings/pcasm-book.pdf): a short book on x86 assembly. 136 | * [GCC Inline Assembly HOWTO](https://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html): a guide to writing assembly code inside a C program. 137 | * [*Intel 80386 Programmer's Reference Manual*](https://pdos.csail.mit.edu/6.828/2018/readings/i386.pdf): the official (and huge) resourcefrom Intel. 138 | 139 | ### xv6 140 | 141 | You don't need to read anything about xv6 until after you start OSTEP; in fact, we recommend holding off on the xv6-related projects until you've finished the entire section on virtualization. After that, you'll need a guide to walk you through the source code. 142 | 143 | The xv6 authors provide a [book](https://pdos.csail.mit.edu/6.828/2018/xv6/book-rev11.pdf) that you can read alongside the source code. There's also a handy line-numbered [PDF version](https://pdos.csail.mit.edu/6.828/2018/xv6/xv6-rev11.pdf) of the code with an index to see exactly where each function or constant gets used. 144 | 145 | However, that book glosses over a lot of the details in the code that you might find challenging, including the advanced C features used, the x86 architecture- specific instructions, and the concurrency aspects (if you haven't finished that section of OSTEP before starting the xv6 projects). To solve this problem, we provide an [annotated guide to xv6](https://github.com/palladian1/xv6-annotated) that goes over the entire xv6 code and analyzes it line-by-line with explanations of the C features, hardware specs, and x86 conventions used. That means it's longer than the official xv6 book, so you don't have to read all of it (and you can probably skip the optional sections unless you care about device drivers), but you can use it as a reference if you're scratching your head about some part of the code. 146 | 147 | Also [here](https://www.youtube.com/playlist?list=PLbtzT1TYeoMhTPzyTZboW_j7TPAnjv9XB) is an excellent video series walking through much of the xv6 code. 148 | 149 | ### Miscellaneous 150 | 151 | You'll need a general sense of how Makefiles work in order to use the Makefile for xv6. [This tutorial](https://makefiletutorial.com) covers much more than you need; just read the "Getting Started" and "Targets" sections and come back to the rest later if you need to look something up (but you shouldn't have to). 152 | 153 | Additional (optional) resources include: 154 | * [GCC Command Options](https://gcc.gnu.org/onlinedocs/gcc-11.1.0/gcc/Invoking-GCC.html#Invoking-GCC): a guide to command-line flags for the GNU C compiler `gcc`. 155 | * [Linker Scripts](https://sourceware.org/binutils/docs/ld/Scripts.html#Scripts): a guide to writing scripts for the GNU linker `ld`. 156 | * [OSDev Wiki](https://wiki.osdev.org): a great resource for all kinds of OS concepts and implementation details. 157 | * [*Linux Kernel Development*](https://www.amazon.com/dp/0672329468): if you want to apply your xv6 knowledge toward contributing to the Linux kernel, this is a great read after OSTEP. 158 | -------------------------------------------------------------------------------- /coursepages/ostep/Reading-order.md: -------------------------------------------------------------------------------- 1 | ### all thanks to [palladian](https://github.com/palladian1) 2 | 3 | * Before starting the course: `initial-utilities` (aka, project 1a) and `initial-reverse` (not assigned in class) 4 | * Chapter 5: `processes-shell` (project 2a) 5 | * Chapter 6: `initial-xv6` (project 1b, but only worry about test 1) 6 | * Chapter 9: `scheduling-xv6-lottery` (project 2b) 7 | * Chapter 24: `vm-xv6-intro` (project 3b) 8 | * Chapter 28: `initial-xv6` (now pass test 2) 9 | * Chapter 29: `concurrency-xv6-threads` (project 4b) 10 | * Chapter 30: `concurrency-mapreduce` (project 4a) 11 | * Chapter 33: `concurrency-webserver` (not assigned in class) 12 | * Chapter 42: `filesystems-checker` (project 5a) 13 | * (there is no 5b, and there are no projects for chapters 43-51) 14 | -------------------------------------------------------------------------------- /coursepages/ostep/Scheduling-xv6-lottery.md: -------------------------------------------------------------------------------- 1 | ## all thanks to [palladian](https://github.com/palladian1) 2 | 3 | ### General Tips 4 | 5 | * Read chapter 9 in the OSTEP book and watch the video for discussion 5. Lottery ticket schedulers aren't discussed in the lectures, so you really do have to read the book for this one. 6 | 7 | * In general, you can't use C standard library functions inside the kernel, because the kernel has to initialize before it can execute library binaries. 8 | 9 | * The xv6 kernel has a "kernel version" of `printf`; it takes an additional integer argument that tells it whether to print to `stdout` or `stderr`. Note that it can only handle basic format strings like `"%d"` and not more complex ones like `"%6.3g"`; you can deal with this by manually adding spaces instead. It also has another similar function, `cprintf`. 10 | 11 | * If you do want to use other library functions that aren't available inside the kernel (pseudo random number generators), you can see how those functions are implemented in P.J. Plauger's book, The Standard C Library, and then implement them yourself. 12 | 13 | ### Implementation 14 | 15 | * You'll have to modify the same files you did in Project 1b in order to add the two new system calls. 16 | * In order to understand how processes are created, remember that they start in the `EMBRYO` state before they become `RUNNABLE`--you'll have to find where that happens. 17 | * System calls always have argument type `void`, so take a look at how system calls like `kill` and `read` manage to work around that limitation and get arguments (like integers and pointers) from user space. You might have to back a few steps in the chain that executes them. 18 | * Make sure you're including `types.h` and `defs.h` wherever you need to access code from other parts of the kernel. 19 | * In order to create the xv6 command `ps`, look at how `cat`, `ls`, and `ln` are implemented. Make sure to modify the Makefile to include the source code for your `ps` command. 20 | 21 | 22 | ## Spoilers below! 23 | 24 | ### Solution walk through 25 | 26 | - Start from a fresh copy of the `xv6` source code. 27 | 28 | - `argint` and `argptr` are important functions. So `syscall`s take no arguments, but in reality, in user code you want to pass arguments to them. 29 | 30 | - So the way you do that is the kernel will call the `syscall`, say, `sys_kill()` with no arguments, then `sys_kill` will use `argint()` to get the arguments from the call stack, then pass that to a function `kill(int pid)`. 31 | 32 | - So you can see there's a bunch of `extern int sys_whatever` function declarations below that; that means that these functions are defined in another file and should be pulled in from there as function pointers. 33 | 34 | - And these `sys_whatever` functions are basically just wrappers for the real `syscall`, which doesn't have the `sys_` at the beginning. So you need to add `sys_settickets` and `sys_getpinfo` to that list of function declarations. 35 | 36 | - Then there's an array of function pointers; it's using this old-school C way of initializing arrays where you can do `int arr[] = { [0] 5, [1] 7}`. 37 | 38 | - And the names inside the square brackets `SYS_fork`, etc. are defined as preprocessor macros in another header file `syscall.h`. 39 | 40 | - So you need to add two more entries in the array with function pointers to `sys_settickets` and `sys_getpinfo`, and then you need to define `SYS_settickets` and `SYS_getpinfo` in the relevant header file. 41 | 42 | - So then all these `sys_` wrapper functions are defined in `sysproc.c`. 43 | 44 | - So there, you need to create `int sys_settickets(void)` and `int sys_getpinfo(void)`. 45 | 46 | - The real `settickets` function will need an int argument, so you need to use `argint` there to grab it from the call stack and pass it to `settickets`; similarly, `getpinfo` will need a pointer, so you'll use `argptr`. 47 | 48 | - Also, there's an extra condition in the if statement for `sys_settickets`; that's because you're not allowed to use a number of tickets below 1. 49 | 50 | - So then there's some assembly code that needs to run for each of the system calls; luckily, it's just a pre-written macro, so you don't have to write any assembly. that's in `usys.S`. 51 | 52 | - So you just add two lines at the bottom to create macros for `SYSCALL(settickets)` and `SYSCALL(getpinfo)` 53 | 54 | - Last part for the `syscalls`: you need to declare them in a header file for user code to be able to call them. that's in `user.h`. 55 | 56 | - So `struct pstat` will be properly defined in `pstat.h`, but you need to declare it in `user.h` as well so that user code doesn't complain when it sees it. 57 | 58 | - Basically, any user code that uses `syscalls` or C (really, `xv6`) standard library functions will have to include `user.h`. 59 | 60 | - So, so far, that's everything for the two system calls as far as the OS is concerned; now we just have to actually implement them with the regular functions `settickets` and `getpinfo`, then implement the scheduler and the `ps` program. 61 | 62 | - `pstat.h` is not for the scheduler, but for the `ps` program, which will work somewhat like the Linux `ps`. `pstat.h` is just to define the `struct pstat`, but there's no `.c` file to go with it. 63 | 64 | - So the scheduler will work by assigning 1 ticket by default to each process when it's created; then processes can set their own tickets using the `settickets` system call. 65 | 66 | - so first we need to make sure each process tracks its own tickets, then we need to assign a default of 1 ticket when creating them, then we need to write `settickets`. 67 | 68 | - the first part is in `proc.h`: processes are represented as a `struct proc`, so we add a new member for `int tickets`. 69 | 70 | - the `int ticks` member is for `ps`; I'll come back to that. 71 | 72 | - One other thing to note in `proc.h` is the `enum procstate`: you can see all the possible process states there. `EMBRYO` means it's in the process of creation; so what i did was `grep` for `EMBRYO` to find where the process was created in order to set the default tickets to 1. Turns out it's in `proc.c`. 73 | 74 | - Inside `proc.c`, there's a function `allocproc`, which initializes a process. 75 | 76 | - There's a process table called `ptable`, and `allocproc` looks through it to find an unused process. 77 | 78 | - Then when it does find it, it goes to create it; i added `p->tickets = 1;` there. 79 | 80 | - okay so the next change is to fit one of the requirements: child processes need to inherit the number of tickets from their parent process. 81 | 82 | - So child processes are created with `fork`, which is in the same file. 83 | 84 | - In `fork`, `curproc` is the current process, and `np` is the new process. 85 | 86 | - So i set `np->tickets = curproc->tickets`. 87 | 88 | - So the scheduler needs to generate a pseudo random number, then it should iterate through the process table with a counter initialized to 0, adding the number of tickets for each process to the counter. once the counter is greater than the pseudo random number, it stops and runs that process. 89 | 90 | - So I ended up looking in P.J. Plauger's The Standard C Library, which is just a big book of all the source code for the C library with commentary. It's pretty good; I don't know if it's still written that way though because the book is from the 80s. 91 | 92 | - So i just implemented C's `rand` and `srand` functions. `srand` sets a random seed (not so random, as you'll see later), then `rand` turns it into a pseudo random integer. 93 | 94 | - There's a bunch of type magic going on there between changes back and forth from integers to unsigned integers; that's to avoid signed integer overflow, which causes undefined behavior. unsigned integer overflow is okay though. 95 | 96 | - I only made one change to make it faster, which was to write `& 32767` instead of `% 32768`. 97 | 98 | - So you'll see the "random" seed i used: the number of `ticks`, which i think counts the number of timer interrupts so far. 99 | 100 | - Which is totally not random at all, since the first time this program gets run, it'll be 0, then 1, then 2, etc. 101 | 102 | - So there's some lines about counting `ticks`; that was for `ps`, not the scheduler. 103 | 104 | - The main change to make it a lottery scheduler is the counter variable. 105 | 106 | - And adding a for loop to count the total number of tickets that have been distributed. 107 | 108 | - So then at the very bottom of this file is the implementation of `settickets` and `getpinfo`. 109 | 110 | - So after initializing `counter` and `totaltickets`, there's for loop that counts the total numbers of tickets that have gone out to processes. 111 | 112 | - Then we get the winning ticket. 113 | 114 | - Let's discuss the original source code first. So first you acquire the lock. You'll release it at the very end. But in between, you have a for loop that iterates over all the processes in `ptable`. 115 | 116 | - Specifically, it iterates over only the processes in `RUNNABLE` state; if a process isn't `RUNNABLE`, it just `continue`s on to the next one. (This is for the round-robin scheduling mechanism that's already in the code.) 117 | 118 | - So now it's gonna switch to the very first `RUNNABLE` process it finds. Like, switching to executing it. 119 | 120 | - So first, `c` represents the current CPU. so it sets the current CPU to run the process it found with `c->proc = p;`. 121 | 122 | - Then it calls this function, `switchuvm(p)`, which sets up the virtual memory address space for `p`. Then it sets the process's state to `RUNNING`. 123 | 124 | - And then `swtch` is where the magic happens: that one swaps out the register contents of the OS and scheduler content with the saved-in-memory register contents of the process `p`. 125 | 126 | - So as soon as `swtch` executes, the CPU will continue executing instructions, but now they're the process's instructions. So this scheduler function just hangs there. 127 | 128 | - Eventually, when a timer interrupt goes off, the processor will use another `swtch` call but with the arguments reversed to swap the scheduler's register contents from memory into the CPU's registers and save the process's register contents. At which point execution will continue at this exact point. 129 | 130 | - So now `switchkvm` will set up the kernel's virtual memory address space. 131 | 132 | - These 5 lines are the context switch: 133 | 134 | ```c 135 | c->proc = p; 136 | switchuvm(p); 137 | p->state = RUNNING; 138 | 139 | swtch(&(c->scheduler), p->context); 140 | switchkvm(); 141 | ``` 142 | 143 | - So then we go on to the next iteration of the inner for loop, which finds the next `RUNNABLE` process and repeats. 144 | 145 | - Only once we've executed all the `RUNNABLE` processes do we exit the inner for loop and release the lock. 146 | 147 | - Original source code is structured like this (this is pseudocode): 148 | 149 | ```python 150 | while (1) { 151 | iterate over processes: 152 | if not runnable: 153 | continue 154 | run it 155 | ``` 156 | 157 | - New code is structured like this (this is pseudocode): 158 | 159 | ```python 160 | while (1) { 161 | count the total tickets allotted to all processes // one for loop here 162 | get the winning ticket number 163 | iterate over processes: // another for loop here 164 | if not runnable: 165 | continue 166 | add its tickets to counter 167 | if counter <= winning ticket number: 168 | continue 169 | run it 170 | ``` 171 | 172 | - We ignore the tickets of non-RUNNABLE processes. 173 | 174 | - So the tickets aren't numbered; each process just has a set amount of tickets, and we just count up until we've passed `n` tickets, where `n` is the winner. 175 | 176 | - For example if proc A has 5 tickets and proc B has 7, proc C has 2. if the winning number is 3, then A would run; if it's 8, then B would run; if it's 12, then C would run. 177 | 178 | - A winner in 0-4 would be A, 5-11 would be B, and 12-13 would be C. 179 | 180 | - So `settickets` is pretty basic: you just acquire a lock, set the tickets for the process, release the lock. 181 | 182 | - For `getpinfo` basically it works like this: 183 | 184 | - `p` is a pointer a `struct pstat`, as defined in `pstat.h`. each of its members is an array, with one entry per process. 185 | 186 | - Check for a null pointer. 187 | 188 | - Iterate over the process table and set `proc_i` to the i-th process. 189 | 190 | - Set the i-th entry of each member of `p` to the value for this process. 191 | 192 | - One last bookkeeping piece: we need to add declarations for `struct pstat` and the `settickets` and `getpinfo` system calls in `defs.h`. 193 | 194 | - And then the last file is `ps.c`, which implements the `ps` program, similar to Linux's `ps`. it just calls `getpinfo` to fill a `struct pstat`, then prints out the info for each process in use. 195 | 196 | - And then you just modify the Makefile to include `ps.c` in the compilation, and we're done! 197 | 198 | - Oh and this is why we needed the ticks in the scheduler: `ps` will print out how long each process has run. 199 | 200 | - So it needs to time the number of ticks that it actually executed. 201 | 202 | - FINALLY run `make qemu` in the `/src` directory to make sure it's all working. 203 | -------------------------------------------------------------------------------- /coursepages/ostep/vm-xv6-intro.md: -------------------------------------------------------------------------------- 1 | Credit goes to [palladian](https://github.com/palladian1) 2 | 3 | ## Intro To xv6 Virtual Memory 4 | 5 | ### WARNING: 6 | 7 | ***The project doesn't match the currently available xv6 source code, which already has this project implemented in it!*** 8 | 9 | [palladian](https://github.com/palladian1) tracked down a different xv6 source from the Github page of a U of Wisconsin student. We had to edit the `Makefile` to find the QEMU executable correctly. We added `null.c` to the `user` folder (also edited `makefile.mk` there), which demonstrates the lack of memory safety. 10 | 11 | Start with the code in [`start.zip`](https://github.com/spamegg1/reviews/raw/master/courses/OSTEP/ostep-projects/vm-xv6-intro/start.zip). Extract it and run `make clean` and `make qemu-nox`. Then inside the xv6 system run `null` to see the lack of safety! If you want to compare the results of `null` with the actual machine code, you can run `objdump -d user/null.o`. 12 | 13 | You might have to manually run `make clean` and `make qemu-nox` every time you make a change to the code. 14 | -------------------------------------------------------------------------------- /extras/courses.md: -------------------------------------------------------------------------------- 1 | # Computer Science - Great Courses 2 | 3 | This is a list of high-quality courses that, for one reason or another, didn't make it into the curriculum. 4 | The most common reasons are that the course isn't available often enough, 5 | or that there was an alternative that fit better into the curriculum. 6 | 7 | ## Programming 8 | 9 | Courses | Duration | Effort 10 | :-- | :--: | :--: 11 | [Introduction to Computational Thinking and Data Science](https://www.edx.org/course/introduction-computational-thinking-data-mitx-6-00-2x-2#!)([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 12 | [Introduction to Computer Science - CS50](https://www.edx.org/course/introduction-computer-science-harvardx-cs50x#!) ([alt](https://cs50.harvard.edu/)) | 12 weeks | 10-20 hours/week 13 | [Introduction to Computer Science (Udacity)](https://www.udacity.com/course/intro-to-computer-science--cs101)| 7 weeks | 10-20 hours/week 14 | [An Introduction to Interactive Programming in Python (Part 1)](https://www.coursera.org/learn/interactive-python-1)| 5 weeks | - 15 | [An Introduction to Interactive Programming in Python (Part 2)](https://www.coursera.org/learn/interactive-python-2)| - | - 16 | [Computing In Python, Part I: Fundamentals and Procedural Programming](https://www.edx.org/course/computing-in-python-i-fundamentals-and-procedural-programming-0) | 5 weeks | 10 hours/week 17 | [Computing In Python, Part II: Control Structures](https://www.edx.org/course/computing-in-python-ii-control-structures-0) | 5 weeks | 10 hours/week 18 | [Computing In Python, Part III: Data Structures](https://www.edx.org/course/computing-in-python-iii-data-structures-0) | 5 weeks | 10 hours/week 19 | [Computing In Python, Part IV: Objects & Algorithms](https://www.edx.org/course/computing-in-python-iv-objects-algorithms-0) | 5 weeks | 10 hours/week 20 | [Programming Basics](https://www.edx.org/course/programming-basics-iitbombayx-cs101-1x)| 9 weeks | 8 hours/week 21 | [Object-Oriented Programming with Java](https://java-programming.mooc.fi/)| 14 weeks | 10 hours/week 22 | [Introduction to Programming with MATLAB](https://www.coursera.org/learn/matlab)| - | - 23 | [Introduction to Functional Programming](https://www.edx.org/course/introduction-functional-programming-delftx-fp101x-0)| 7 weeks | 4-6 hours/week 24 | [The Structure and Interpretation of Computer Programs](http://cs61a.org/) | - | - 25 | [Introduction to Haskell](https://www.seas.upenn.edu/~cis194/fall16/) | 14 weeks | 4 hours/week 26 | 27 | ## Math 28 | 29 | Courses | Duration | Effort 30 | :-- | :--: | :--: 31 | [Effective Thinking Through Mathematics](https://learning.edx.org/course/course-v1:UTAustinX+UT.9.10x+3T2016/home) | 4 weeks | 2 hours/week 32 | [Introduction to Mathematical Thinking](https://www.coursera.org/learn/mathematical-thinking) | 10 weeks | 10 hours/week 33 | [High School Math](https://www.khanacademy.org/math/high-school-math) | - | - 34 | [Precalculus](https://www.futurelearn.com/courses/precalculus) | 5 weeks | 6 hours/week 35 | [Advanced Precalculus](https://www.futurelearn.com/courses/advanced-precalculus) | 4 weeks | 5 hours/week 36 | [Introduction to Probability and Data](https://www.coursera.org/learn/probability-intro)| - | - 37 | [Linear Algebra (Strang)](https://ocw.mit.edu/courses/mathematics/18-06-linear-algebra-spring-2010/index.htm) | - | - 38 | [Introduction to Computational Thinking](https://computationalthinking.mit.edu/Spring21/#introduction_to_computational_thinking) | - | - 39 | [Multivariable Calculus](https://ocw.mit.edu/courses/mathematics/18-02sc-multivariable-calculus-fall-2010/index.htm) | 13 weeks | 12 hours/week 40 | [Introduction to Probability - The Science of Uncertainty](https://www.edx.org/course/introduction-probability-science-mitx-6-041x-2) | 18 weeks | 12 hours/week | [Multivariable Calculus](https://ocw.mit.edu/courses/mathematics/18-02sc-multivariable-calculus-fall-2010/index.htm) 41 | 42 | ## Systems 43 | 44 | Courses | Duration | Effort 45 | :-- | :--: | :--: 46 | [Cloud Computing / Distributed Programming](https://www.coursera.org/learn/cloud-computing) | 5 weeks | 5-10 hours/week 47 | [Introduction to Parallel Programming](https://classroom.udacity.com/courses/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 48 | [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 49 | [Great Ideas in Computer Architecture (Machine Structures)](https://inst.eecs.berkeley.edu/~cs61c/fa14/) ([Lectures](https://archive.org/details/ucberkeley_webcast_itunesu_915550404)) | 15 weeks | 12 hours/week 50 | [Computer Architecture](https://www.coursera.org/learn/comparch) | - | 5-8 hours/week 51 | [Operating System Engineering](http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-828-operating-system-engineering-fall-2012/) | - | - 52 | [Introduction to Operating Systems](https://www.udacity.com/course/introduction-to-operating-systems--ud923)| 8 weeks | 5-8 hours/week 53 | [Advanced Operating Systems](https://www.udacity.com/course/advanced-operating-systems--ud189)| 5 weeks | 5-8 hours/week 54 | [Computer Networking](https://www.udacity.com/course/computer-networking--ud436) | 12 weeks | 5-8 hours/week 55 | 56 | ## Theory 57 | 58 | Courses | Duration | Effort 59 | :-- | :--: | :--: 60 | [Algorithms, Part I](https://www.coursera.org/learn/algorithms-part1) | 6 weeks | 6-12 hours/week 61 | [Algorithms, Part II](https://www.coursera.org/learn/algorithms-part2) | 6 weeks | 6-12 hours/week 62 | [Analysis of Algorithms (Sedgewick)](https://www.coursera.org/learn/analysis-of-algorithms) | 6 weeks | 6-8 hours/week 63 | [Analysis of Algorithms (Skiena)](http://www3.cs.stonybrook.edu/~skiena/373/) | 15 weeks | 6-8 hours/week 64 | [Programming Challenges (Skiena)](http://www3.cs.stonybrook.edu/~skiena/392/) | 14 weeks | 6-8 hours/week 65 | [Data Structures and Algorithms (Specialization)](https://www.coursera.org/specializations/data-structures-algorithms) | 25 weeks | 3-10 hours/week 66 | [Algorithmic Thinking (Part 1)](https://www.coursera.org/learn/algorithmic-thinking-1/) | - | - 67 | [Algorithmic Thinking (Part 2)](https://www.coursera.org/learn/algorithmic-thinking-2/) | - | - 68 | [Statistical Mechanics: Algorithms and Computations](https://www.coursera.org/learn/statistical-mechanics/) | - | - 69 | [Approximation Algorithms Part I](https://www.coursera.org/learn/approximation-algorithms-part-1/) | - | - 70 | [Approximation Algorithms Part II](https://www.coursera.org/learn/approximation-algorithms-part-2/) | - | - 71 | 72 | ## Applications 73 | 74 | Courses | Duration | Effort 75 | :-- | :--: | :--: 76 | [Using Databases with Python](https://www.coursera.org/learn/python-databases) | 5 weeks | 2-3 hours/week 77 | [Database Systems](https://scs.hosted.panopto.com/Panopto/Pages/Sessions/List.aspx#folderID=%22ed2ee867-9610-4bad-94af-5d12c2ea47cd%22) | - | 27 hours 78 | [Database Management Essentials](https://www.coursera.org/learn/database-management) | 7 weeks | 4-6 hours/week 79 | [Intro to Artificial Intelligence](https://www.udacity.com/course/intro-to-artificial-intelligence--cs271)| 16 weeks | 6-10 hours/week 80 | [Intro to Machine Learning](https://www.udacity.com/course/intro-to-machine-learning--ud120)| 10 weeks | 6-10 hours/week 81 | [Machine Learning for Data Science and Analytics](https://www.edx.org/course/machine-learning-data-science-analytics-columbiax-ds102x-0)| 5 weeks | 7-10 hours/week 82 | [Big Data Science with the BD2K-LINCS Data Coordination and Integration Center](https://www.coursera.org/course/bd2klincs)| 7 weeks | 4-5 hours/week 83 | 84 | ## Tools 85 | 86 | Courses | Duration | Effort 87 | :-- | :--: | :--: 88 | [How to Use Git and GitHub](https://www.udacity.com/course/how-to-use-git-and-github--ud775) | 3 weeks | 2-3 hours/week 89 | [Kubernetes Certified Application Developer](https://www.udemy.com/course/certified-kubernetes-application-developer/) | 5 weeks | 2 hours/week 90 | 91 | 92 | # Online Learning - Great Courses 93 | 94 | Courses | Duration | Effort 95 | :-- | :--: | :--: 96 | [Learning How to Learn](https://www.coursera.org/learn/learning-how-to-learn) | 4 weeks | 2 hours/week 97 | [Mindshift](https://www.coursera.org/learn/mindshift) | 4 weeks | 2 hours/week 98 | -------------------------------------------------------------------------------- /extras/other_curricula.md: -------------------------------------------------------------------------------- 1 | # Other curricula 2 | 3 | OSSU is one of a few efforts to inform learners how they can pursue computer science independently. Below are a few other such efforts. 4 | 5 | - [Google - Guide for Technical Development](https://www.google.com/about/careers/students/guide-to-technical-development.html) 6 | - [Teach Yourself Computer Science](https://teachyourselfcs.com/) 7 | - [Obtaining a Thorough CS Background Online](http://spin.atomicobject.com/2015/05/15/obtaining-thorough-cs-background-online/) 8 | - [P1xt](https://github.com/P1xt/p1xt-guides) 9 | - [Functional CS](https://functionalcs.github.io/curriculum/) 10 | 11 | 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. 12 | 13 | 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. 14 | -------------------------------------------------------------------------------- /extras/puzzles-practice-plods.md: -------------------------------------------------------------------------------- 1 | # Computer Science - Puzzles, Practice and Plods 2 | 3 | **Some OSSUnians value sites that allow them to practice coding problems disconnected from a course.** 4 | 5 | > 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. 6 | 7 | [link](https://github.com/ossu/computer-science/issues/783#issuecomment-694187743) 8 | 9 | > 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. 10 | 11 | [link](https://github.com/ossu/computer-science/issues/783#issuecomment-694176898) 12 | 13 | **Others feel that its important not to get distracted by anxieties and puzzles.** 14 | 15 | > Consider this a love letter to all the beginners out there. 16 | 17 | > 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. 18 | It FEELS like taking classes, doing programming assignments etc. are not good enough in your eyes to be considered worthy of a "project". 19 | They feel too small and insignificant. You're not quite satisfied. 20 | (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.) 21 | 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. 22 | I'VE BEEN THERE, trust me. 23 | And naturally you are in a rush to become competent as fast as possible. 24 | You keep thinking, "when will I be ready to do something BIG?" And you don't want to wait. 25 | Similar to how children always seem like they are in a hurry to grow up and start imitating adults. 26 | The dissatisfaction and the impatience make for an uncomfortable combination. 27 | Let's call this: beginner's mind. 28 | 29 | > The fact is, you have to be patient. 30 | I would argue that early on in your studies, arguably, is NOT when it is most critical for you to contribute to a project... 31 | 32 | > 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. 33 | Looking for a project? How about THE NEXT COURSE? 34 | 35 | > So I think that the problem is not really a problem, but a need to adjust expectations. 36 | I would recommend a shift in thinking, away from beginner's mind. 37 | 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 38 | 39 | [link](https://github.com/ossu/computer-science/issues/783#issuecomment-690023645) 40 | 41 | So OSSUnian, read the above and then consider how much time you wish to put into these resources: 42 | - [Exercism](https://exercism.io/) 43 | - [LeetCode](https://leetcode.com/) 44 | - [HackerRank](https://www.hackerrank.com/) 45 | - [CodeWars](https://www.codewars.com/) 46 | - [100+ Python Coding Problems with Solutions](https://github.com/ProgrammingHero1/100-plus-python-coding-problems-with-solutions) 47 | - [Rosalind](http://rosalind.info/problems/locations/) 48 | - [Advent of Code](https://adventofcode.com/) 49 | - [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. 50 | -------------------------------------------------------------------------------- /extras/readings.md: -------------------------------------------------------------------------------- 1 | # Computer Science - Great Readings 2 | 3 | This document consists of great books or articles on computer science. 4 | Some are here because there is a course covering the same material; 5 | some are just great books that you should read at some point in your career. 6 | 7 | Once you have made it through most of the curriculum, knowing whether a book is worth your time will become easier. 8 | Or, if you are struggling in one of the courses, perhaps reading a book on the subject will help. 9 | 10 | ## Programming 11 | 12 | Name | Author(s) 13 | :-- | :--: 14 | [Introduction to Computation and Programming Using Python 3e](https://mitpress.mit.edu/books/introduction-computation-and-programming-using-python-third-edition) | John V. Guttag 15 | [Think Python 2e](http://greenteapress.com/wp/think-python-2e/) | Allen B. Downey 16 | [How to Design Programs 2e](https://www.htdp.org/) | Matthias Felleisen, Robert Bruce Findler, Matthew Flatt, Shriram Krishnamurthi 17 | [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 18 | [Concepts, Techniques, and Models of Computer Programming](https://www.amazon.com/gp/product/0262220695) | Peter Van Roy, Seif Haridi 19 | [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 20 | [Refactoring](https://www.refactoring.com/) | Martin Fowler 21 | [Clean Code](https://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882) | Robert Martin 22 | [Code Complete 2e](https://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670) | Steve McConnell 23 | [The Pragmatic Programmer 2e](https://pragprog.com/titles/tpp20/the-pragmatic-programmer-20th-anniversary-edition/) | Andrew Hunt, David Thomas 24 | [Programming Languages: Application and Interpretation](http://cs.brown.edu/~sk/Publications/Books/ProgLangs/) | Shriram Krishnamurthi 25 | [Programming and Programming Languages](https://papl.cs.brown.edu/2018/) | Shriram Krishnamurthi, Benjamin S. Lerner, Joe Gibbs Politz 26 | [Competitive Programming](https://cpbook.net/) | Steven Halim, Felix Halim 27 | [Introduction to computing in Java](https://introcs.cs.princeton.edu/java/home/) | Robert Sedgewick, Kevin Wayne 28 | 29 | ## Math 30 | 31 | Name | Author(s) 32 | :-- | :--: 33 | [Calculus Made Easy](http://www.gutenberg.org/ebooks/33283) | Silvanus P. Thompson 34 | [Ximera: Interactive Calculus Textbooks](https://ximera.osu.edu/) | [Ximera team](https://ximera.osu.edu/about/team) 35 | [Discrete Mathematics with Applications (4th Edition)](http://www.amazon.com/Discrete-Mathematics-Applications-Susanna-Epp/dp/0495391328/) | Susanna S. Epp 36 | [Discrete Mathematics: An Open Introduction](http://discrete.openmathbooks.org/dmoi/) | Oscar Levin 37 | [Applied Discrete Structures](http://faculty.uml.edu/klevasseur/ads2/) | Alan Doerr, Ken Levasseur 38 | [Grinstead and Snell’s Introduction to Probability](https://math.dartmouth.edu/~prob/prob/prob.pdf) | Charles M. Grinstead, J. Laurie Snell 39 | [Linear Algebra for Everyone](https://math.mit.edu/~gs/everyone/) | Gilbert Strang 40 | [The Art of Linear Algebra](https://github.com/kenjihiranabe/The-Art-of-Linear-Algebra) | Kenji Hiranabe, Gilbert Strang 41 | 42 | ## Systems 43 | 44 | Name | Author(s) 45 | :-- | :--: 46 | [But How Do It Know?](http://www.buthowdoitknow.com/) | J. Clark Scott 47 | [Computer Systems: A Programmer's Perspective (3rd Edition)](http://csapp.cs.cmu.edu/) | Randal E. Bryant, David R. O'Hallaron 48 | [Modern Operating Systems (4th Edition)](http://www.amazon.com/Modern-Operating-Systems-Andrew-Tanenbaum/dp/013359162X/) | Andrew S. Tanenbaum, Herbert Bos 49 | [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 50 | [Computer Networks (5th Edition)](http://www.amazon.com/Computer-Networks-5th-Andrew-Tanenbaum/dp/0132126958/) | Andrew S. Tanenbaum, David J. Wetherall 51 | [Computer Networking: A Top-Down Approach (8th Edition)](https://gaia.cs.umass.edu/kurose_ross/index.html) | James F Kurose, Keith W Ross 52 | [Distributed Systems: Principles and Paradigms](https://www.amazon.com/Distributed-Systems-Principles-Andrew-Tanenbaum/dp/153028175X) | Andrew Tanenbaum 53 | [Operating Systems Design and Implementation](https://www.amazon.com/Operating-Systems-Design-Implementation-3rd/dp/0131429388) | Andrew S. Tanenbaum, Albert S. Woodhull 54 | [Crafting Interpreters](https://www.craftinginterpreters.com/contents.html) | Robert Nystrom 55 | [Principles of Compiler Design](https://www.amazon.com/Principles-Compiler-Addison-Wesley-information-processing/dp/0201000229) | Alfred Aho, Jeffrey Ullman 56 | [Distributed Systems Reading Group](http://dsrg.pdos.csail.mit.edu/papers/) | Various 57 | [System Design: Design large-scale systems](https://github.com/donnemartin/system-design-primer) | Various 58 | 59 | ## Theory 60 | 61 | Name | Author(s) 62 | :-- | :--: 63 | [Introduction to Computing: Explorations in Language, Logic, and Machines](http://www.computingbook.org/) | David Evans 64 | [Introduction to the Theory of Computation (3rd Edition)](https://www.amazon.com/Introduction-Theory-Computation-Michael-Sipser/dp/113318779X) | Michael Sipser 65 | [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 66 | [The Algorithm Design Manual (3rd Edition)](https://www.algorist.com/) | Steven Skiena 67 | [Algorithms (4th Edition)](https://algs4.cs.princeton.edu/home/) | Robert Sedgewick 68 | [Category Theory: A Gentle Introduction](http://www.logicmatters.net/resources/pdfs/GentleIntro.pdf) | Peter Smith 69 | [Category Theory for Programmers: The Preface](https://bartoszmilewski.com/2014/10/28/category-theory-for-programmers-the-preface/) | Bartosz Milewski 70 | [An Introduction to Information Retrieval](https://nlp.stanford.edu/IR-book/pdf/irbookonlinereading.pdf) | Christopher D. Manning, Prabhakar Raghavan, Hinrich Schütze 71 | [Computer Science: An interdisciplinary approach](https://introcs.cs.princeton.edu/java/cs/) | Robert Sedgewick, Kevin Wayne 72 | [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) 73 | 74 | ## Applications 75 | 76 | Name | Author(s) 77 | :-- | :--: 78 | [Architecture of a Database System](http://db.cs.berkeley.edu/papers/fntdb07-architecture.pdf) | Joseph M. Hellerstein, Michael Stonebraker, James Hamilton 79 | [Readings in Database Systems (5th Edition)](http://www.redbook.io/) | Peter Bailis, Joseph M. Hellerstein, Michael Stonebraker, editors 80 | [Database Management Systems (3rd Edition)](https://www.amazon.com/gp/product/0072465638) | Raghu Ramakrishnan, Johannes Gehrke 81 | [Transaction Processing: Concepts and Techniques](https://www.amazon.com/Transaction-Processing-Concepts-Techniques-Management/dp/1558601902) | Jim Gray, Andreas Reuter 82 | [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 83 | [The Architecture of Open Source Applications](http://aosabook.org/en/) | Michael DiBernardo (editor) 84 | [An Introduction to Statistical Learning](https://www-bcf.usc.edu/~gareth/ISL/) | Gareth James, Daniela Witten, Trevor Hastie and Robert Tibshirani 85 | [Deep Learning](http://www.deeplearningbook.org/) | Ian Goodfellow, Yoshua Bengio and Aaron Courville 86 | [Bayesian Reasoning and Machine Learning](http://web4.cs.ucl.ac.uk/staff/D.Barber/pmwiki/pmwiki.php?n=Brml.HomePage) | David Barber 87 | [Language Implementation Patterns](https://www.amazon.com/gp/product/193435645X) | Terence Parr 88 | [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 89 | [Compiler Construction](https://inf.ethz.ch/personal/wirth/CompilerConstruction/index.html) | Niklaus Wirth 90 | [The Mythical Man-Month](https://www.amazon.com/Mythical-Man-Month-Software-Engineering-Anniversary/dp/0201835959/) | Fred Brooks, Jr. 91 | [Physically Based Rendering: From Theory To Implementation](http://www.pbr-book.org/) | Matt Pharr, Wenzel Jakob, and Greg Humphreys 92 | 93 | 94 | ## Tools 95 | 96 | Name | Author(s) 97 | :-- | :--: 98 | [The Linux Command Line](https://linuxcommand.org/tlcl.php) | by William Shotts 99 | --------------------------------------------------------------------------------